UNIX TCP回射服务器/客户端(5)

程序简介:这是一个基本的多线程服务器模型。当一个客户端连接上服务器时,服务器就产生一个子线程来与客户端进行通信。这种通信机制效率比较低,但高于一个连接产生一个子进程的多进程服务器模型,和多进程服务器模型一样,最大连接数会受到系统的最大子线程数的限制。

上代码:

#include "my_unp.h" 

void str_echo(int sockfd)   
{   
 ssize_t n;   
 char buf[MAXLINE];   

again:   
 //从套接字中读取数据,写到buffer中去   
 //再将buffer中的数据写到套接字中去   
 while( (n=read(sockfd, buf, MAXLINE)) > 0 )   
  Writen(sockfd, buf, n);   

//由于信号中断,没写或读成功任何数据   
 if( n<0 && errno==EINTR )   
  goto again;   
 else if( n < 0 )   
  error_quit("str_echo: read error");   
}   

static void *doit(void *arg) 

 int connfd; 

connfd = *((int *) arg); 
 free(arg); 

//子线程不阻塞父线程 
 Pthread_detach(pthread_self()); 
 //处理数据 
 str_echo(connfd); 
 //关闭连接 
 Close(connfd); 

return(NULL); 

int main(int argc, char **argv) 

 int  listenfd, *iptr; 
 pthread_t    tid; 
 socklen_t    addrlen, len; 
 struct sockaddr *cliaddr;
 struct sockaddr_in servaddr;

//开始监听 
 listenfd = Socket(AF_INET, SOCK_STREAM, 0);   
 memset(&servaddr, 0, sizeof(servaddr));   
 servaddr.sin_family = AF_INET;   
 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);   
 servaddr.sin_port = htons(SERV_PORT);   

addrlen = sizeof(struct sockaddr);
 //把socket和socket地址结构联系起来     
 Bind(listenfd, (SA*)&servaddr, sizeof(servaddr));   
 //开始监听LISTENQ端口   
 Listen(listenfd, LISTENQ);   
 cliaddr = Malloc(addrlen); 

while(1) 
 { 
  len = addrlen; 
  iptr = Malloc(sizeof(int)); 
  *iptr = Accept(listenfd, cliaddr, &len); 
  //为每个连接新建一个线程 
  Pthread_create(&tid, NULL, &doit, iptr); 
 } 
 return 0; 

与其配套的客户端在这里:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/705b6d211bf1cc988c7ad0b9b8966423.html