socket多线程并发异步通讯

本文提供了一个Linux下的socket多线程异步通讯例程,使用了select函数进行I/O复用,实现了服务器监听并创建新线程处理客户端请求的功能。通过键盘输入与客户端进行交互,接收到消息后进行相应的发送和接收操作。
/*
作者:雷云
email:bowaytec@yahoo.com.cn
qq: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 5

void 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);
}


 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值