/**//*作者:雷云email:bowaytec@yahoo.com.cnqq:52192976日期:2007-5-20一下代码可供linux爱好者提供借鉴,如有不足之处请斧正project:socket多线程异步通讯例程*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<sys/socket.h>#include<netinet/in.h>#include<pthread.h>#include<arpa/inet.h>#include<sys/types.h>#include<sys/time.h>#include<errno.h>#define BUFFSIZE 1024#define PORT 1120#define BACKLOG 5#define MAXFD 5void doClientRequest(int client_sock)...{ char buff[BUFSIZ]; int result; fd_set readfd;//,writefd; struct timeval tv; tv.tv_sec=1; tv.tv_usec=0; for(;;) ...{ bzero(buff,sizeof(buff)); FD_ZERO(&readfd); //FD_ZERO(&writefd); FD_SET(0,&readfd); FD_SET(client_sock,&readfd); if((result=select(client_sock+1,&readfd,NULL,NULL,&tv))==-1)//开始等待输入输出操作 ...{ perror("server select:"); exit(-1); }else if(result==0)...{ //printf("FD_ISSET(0,&readfd)=%d",FD_ISSET(0,&readfd)); //printf("FD_ISSET(client_sock,&readfd)=%d",FD_ISSET(client_sock,&readfd)); //printf("have no message comming "); // sleep(3); continue; }else...{ if(FD_ISSET(0,&readfd)) ...{ /**//*用户按键事件响应*/ fgets(buff,sizeof(buff),stdin); if(!strncasecmp(buff,"quit",4)) ...{ printf("%d client customer exit chat ",client_sock); break; } result=send(client_sock,buff,strlen(buff)+1,0); if(result>0) ...{ printf("send %d byte %s ",result,buff); } else...{ printf("消息'%s'发送失败!错误代码是%d,错误信息是'%s' ",buff, errno, strerror(errno)); break; } } if(FD_ISSET(client_sock,&readfd)) ...{ /**//*客户端接收数据事件*/ result=recv(client_sock,buff,BUFSIZ,0); if(result>0) ...{ printf("accepte message success:%s ,counter %d byte ",buff,result); }else...{ if(result<0) ...{ printf("message recive failse "); }else...{ printf("%d client customer exit ",client_sock); } break; } } } }}void doClientThread(void *pParam)...{ int clientSocket=(int)pParam; doClientRequest(clientSocket); close(clientSocket); printf("%d >client socket close ok ",clientSocket);}int main(void)...{ int server_sock,client_sock,result,len; struct sockaddr_in serveraddr; pthread_t pt; if((server_sock=socket(AF_INET,SOCK_STREAM,0))<0) ...{ perror("server socket:"); exit(-1); } puts("server socket is OK!"); bzero(&serveraddr,sizeof(serveraddr)); serveraddr.sin_family=AF_INET; serveraddr.sin_addr.s_addr=htonl(INADDR_ANY); serveraddr.sin_port=htons(PORT); len=sizeof(serveraddr); if((result=bind(server_sock,(struct sockaddr*)&serveraddr,sizeof(serveraddr)))<0) ...{ perror("server bind:"); exit(-1); } puts("server bind is OK!"); if((result=listen(server_sock,BACKLOG))<0) ...{ perror("server listen:"); exit(-1); } puts("server listen is OK!"); for(;;) ...{ if((client_sock=accept(server_sock,(struct sockaddr*)&serveraddr,(socklen_t*)&len))==0) ...{ perror("server accept:"); exit(-1); } if((result=pthread_create(&pt,NULL,doClientThread,(void *)client_sock))!=0) ...{ perror("pthread create:"); exit(-1); } printf("%d create thread ok ",client_sock); } exit(0);}