/************************************
* For msmr
* server.c
* tesing the speed of bufferevent_write
* 2015-02-03
* author@tom
************************************/
/*
#include
#include
#include
#include
#include
#include
#include
#include
evutil_socket_t fd;
static void server_on_read(struct bufferevent* bev,void* arg){
struct timeval start_t;
// int sockfd;
gettimeofday(&start_t,NULL);
printf("Warning: server_on_read start timestamp %lu.%06lu\n", start_t.tv_sec, start_t.tv_usec);
struct evbuffer* input = bufferevent_get_input(bev);
size_t len = 0;
len = evbuffer_get_length(input);
printf("There Is %u Bytes Data In The Buffer In Total.\n",
(unsigned)len);
// read
char* buf;
buf = (char*)malloc(sizeof(char)*len);
if(NULL==buf){return;}
//evbuffer_copyout(input,buf,len); // it do not clear the input buffer
evbuffer_remove(input,buf,len); // clear the buffer
printf("Server gets the message from client: %s\n", buf);
// write(bev, "OK", 2);
send(fd,"OK",2+1,0);
// check
len = 0;
len = evbuffer_get_length(input);
printf("After the first reading, there Is %u Bytes Data Left In The Buffer.\n",
(unsigned)len);
free(buf);
buf=NULL;
return;
}
void server_on_accept(struct evconnlistener* listener,evutil_socket_t fd,struct sockaddr *address,int socklen,void *arg)
{
printf("accept a client : %d\n", fd);
// set TCP_NODELAY
int enable = 1;
if(setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&enable, sizeof(enable)) < 0)
printf("Consensus-side: TCP_NODELAY SETTING ERROR!\n");
struct event_base *base = evconnlistener_get_base(listener);
struct bufferevent* new_buff_event = bufferevent_socket_new(base,fd,BEV_OPT_CLOSE_ON_FREE);
// bufferevent_setwatermark(new_buff_event, EV_READ, 72, 0);
bufferevent_setcb(new_buff_event,server_on_read,NULL,NULL,NULL);
// set a read timeout of 1000 us
// struct timeval tv = {0, 10000};
// bufferevent_set_timeouts(new_buff_event, &tv, NULL);
bufferevent_enable(new_buff_event,EV_READ|EV_WRITE);
return;
}
int main()
{
int port = 9876;
struct sockaddr_in my_address;
memset(&my_address, 0, sizeof(my_address));
my_address.sin_family = AF_INET;
my_address.sin_addr.s_addr = htonl(0x7f000001); // 127.0.0.1
my_address.sin_port = htons(port);
struct event_base* base = event_base_new();
struct evconnlistener* listener =
evconnlistener_new_bind(base,server_on_accept,
NULL,LEV_OPT_CLOSE_ON_FREE|LEV_OPT_REUSEABLE,-1,
(struct sockaddr*)&my_address,sizeof(my_address));
if(!listener)
exit(1);
event_base_dispatch(base);
evconnlistener_free(listener);
event_base_free(base);
return 0;
}
*/
#include // for sockaddr_in
#include // for socket
#include // for socket
#include // for printf
#include // for exit
#include // for bzero
/*
#include
#include
#include
#include
*/
#define HELLO_WORLD_SERVER_PORT 9876
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv)
{
//设置一个socket地址结构server_addr,代表服务器internet地址, 端口
int rec_flag;
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr)); //把一段内存区的内容全部设置为0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
//创建用于internet的流协议(TCP)socket,用server_socket代表服务器socket
int server_socket = socket(PF_INET,SOCK_STREAM,0);
if( server_socket < 0)
{
printf("Create Socket Failed!");
exit(1);
}
{
int opt =1;
setsockopt(server_socket,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
}
//把socket和socket地址结构联系起来
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit(1);
}
//server_socket用于监听
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
{
printf("Server Listen Failed!");
exit(1);
}
while (1) //服务器端要一直运行
{
//定义客户端的socket地址结构client_addr
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
//接受一个到server_socket代表的socket的一个连接
//如果没有连接请求,就等待到有连接请求--这是accept函数的特性
//accept函数返回一个新的socket,这个socket(new_server_socket)用于同连接到的客户的通信
//new_server_socket代表了服务器和客户端之间的一个通信通道
//accept函数把连接到的客户端信息填写到客户端的socket地址结构client_addr中
int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket < 0)
{
printf("Server Accept Failed!\n");
break;
}
char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);
length = recv(new_server_socket,buffer,BUFFER_SIZE,0);
if (length < 0)
{
printf("Server Recieve Data Failed!\n");
break;
}
char file_name[FILE_NAME_MAX_SIZE+1];
bzero(file_name, FILE_NAME_MAX_SIZE+1);
strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
printf("%s\n",file_name);
bzero(buffer, BUFFER_SIZE);
int file_block_length = 0;
if(length>0)
rec_flag=1;
while(rec_flag)
{
printf("file_block_length = %d\n",file_block_length);
//发送buffer中的字符串到new_server_socket,实际是给客户端
if(send(new_server_socket,"OK",2,0)<0)
{
printf("Send File:\t%s Failed\n", file_name);
break;
}
rec_flag=0;
bzero(buffer, BUFFER_SIZE);
//sleep(5);
}
// close(fp);
// fclose(fp);
printf("File:\t%s Transfer Finished\n",file_name);
// }
//关闭与客户端的连接
// close(new_server_socket);
}
//关闭监听用的socket
// close(server_socket);
return 0;
}
阅读(1699) | 评论(0) | 转发(0) |