23,125
社区成员
发帖
与我相关
我的任务
分享
void *sock_read(int client)
{
······
}
static void sock_accept(int server_socket,short event,void *arg)//char **argv
{
printf("start sock_accept\n");
struct event *ev=arg;
int new_server_socket;
////////////////////////////////////////
/////////////////////////////////
printf("start accept\n");
while(1) //服务器端要一直运行,
{
////////////////////////////////
/////////////////////////////////
struct sockaddr addr;
socklen_t len=sizeof(addr);
//由于此结构要长期使用,所以rev必须动态分配,否则离开此函数后会自动释放,导致segment fault
struct event *rev=(struct event *)malloc(sizeof(struct event));//*rev
new_server_socket=accept(server_socket,&addr,&len);
if(new_server_socket==-1)
{
fprintf(stderr,"Sock Accept Failed!\n");
return;
}
fprintf(stdout,"accept socket:%d\n",new_server_socket);
////////////////////////////////
///////////////////////////////
pthread_t child_thread;
pthread_mutex_init(&mutex,NULL);//初始化
printf("start talk to sock_read\n");
if((pthread_create(&child_thread,NULL,sock_read(new_server_socket),NULL))<0)//* talk_to_client
pthread_mutex_lock(&mutex);
sleep(5);
if(child_thread!=0)
{
printf("pthread_join\n");
pthread_join(child_thread,NULL);
pthread_mutex_unlock(&mutex);
printf("线程已经结束\n");
}
//创建一个读事件,当有客户连接时,接收通知。
event_set(rev,new_server_socket,EV_READ,(void *)sock_read,rev);
event_add(rev,NULL);
event_add(ev,NULL);
printf("end sock_accept\n");
free(rev);
////////////////////////////
////////////////////////////
/* 关闭 socket */
close(new_server_socket);
}
}
int main ()//int argc, char **argv
{
struct event ev; //= arg
int server_socket;
struct sockaddr_in addr;
server_socket=socket(AF_INET,SOCK_STREAM,0);
if (server_socket==-1)
{
perror("socket error\n");
exit(-1);
}
bzero(&addr,sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);
addr.sin_addr.s_addr=htonl(INADDR_ANY); //INADDR_ANY;IPADDR
/*创建监听的socket*/
if((bind(server_socket,(struct sockaddr*)&addr,sizeof(addr)))==-1)
{
perror("bind error\n");
exit(-1);
}
if ((listen(server_socket,128))==-1)
{
perror("listen error\n");
exit(-1);
}
/*初始化libevent*/
struct event_base * base=event_init();
/*创建一个读事件,当有客户连接时,接收通知。*/
event_set(&ev,server_socket,EV_READ,sock_accept,&ev);//sock_accept
event_add(&ev,NULL);
printf("start dispatch\n");
event_dispatch();//开始事件循环
printf("end dispatch\n");
return (0);
}