技术员联盟提供win764位系统下载,win10,win7,xp,装机纯净版,64位旗舰版,绿色软件,免费软件下载基地!

当前位置:主页 > 教程 > 服务器类 >

Linux下基于socket多线程并发通信的实现

来源:技术员联盟┆发布时间:2018-06-14 06:00┆点击:

分类: Linux2011-05-21 18:13 8455人阅读 评论(5) 收藏 举报socket多线程linuxserverstruct服务器[cpp] view plaincopy

/*************************************************** 

* 文件名:pthread_server.c 

* 文件描述:创建子线程来接收客户端的数据 

***************************************************/  

#include <sys/types.h>  

#include <sys/socket.h>  

#include <stdio.h>  

#include <netinet/in.h>  

#include <arpa/inet.h>  

#include <unistd.h>  

#include <stdlib.h>  

#include <pthread.h>  

void *rec_data(void *fd);  

int main(int argc,char *argv[])  

{  

       int server_sockfd;  

    int *client_sockfd;  

       int server_len, client_len;  

       struct sockaddr_in server_address;  

       struct sockaddr_in client_address;  

       struct sockaddr_in tempaddr;  

       int i,byte;  

       char char_recv,char_send;  

       socklen_t templen;  

       server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建套接字  

   

       server_address.sin_family = AF_INET;  

       server_address.sin_addr.s_addr =  htonl(INADDR_ANY);  

       server_address.sin_port = htons(9734);  

       server_len = sizeof(server_address);  

        

       bind(server_sockfd, (struct sockaddr *)&server_address, server_len);//绑定套接字  

       templen = sizeof(struct sockaddr);  

   

       printf("server waiting for connect/n");  

       while(1){  

              pthread_t thread;//创建不同的子线程以区别不同的客户端  

              client_sockfd = (int *)malloc(sizeof(int));  

              client_len = sizeof(client_address);  

              *client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, (socklen_t *)&client_len);  

              if(-1==*client_sockfd){  

                     perror("accept");  

                     continue;  

              }  

              if(pthread_create(&thread, NULL, rec_data, client_sockfd)!=0)//创建子线程  

              {  

                     perror("pthread_create");  

                     break;  

              }  

       }  

       shutdown(*client_sockfd,2);  

       shutdown(server_sockfd,2);  

}  

/***************************************** 

* 函数名称:rec_data 

* 功能描述:接受客户端的数据 

* 参数列表:fd——连接套接字 

* 返回结果:void 

*****************************************/  

void *rec_data(void *fd)  

{  

       int client_sockfd;  

       int i,byte;  

       char char_recv[100];//存放数据  

       client_sockfd=*((int*)fd);  

       for(;;)  

       {  

              if((byte=recv(client_sockfd,char_recv,100,0))==-1)  

              {  

                     perror("recv");  

                     exit(EXIT_FAILURE);   

              }  

              if(strcmp(char_recv, "exit")==0)//接受到exit时,跳出循环  

                     break;