1、服务器端
/*tcpserver.c 2011.9.1 by yyg*/#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <pthread.h>#define myport 3490 //定义端口#define backlog 10#define maxdatasize 1024int sockfd,new_fd;pthread_t accthread,recthread;void recmessage(void){ //接收客户端信息函数 while(1){ int numbytes; char buf[maxdatasize]; if((numbytes = recv(new_fd,buf,maxdatasize,0))==-1){ perror(recv); exit(1); } buf[numbytes]='\0'; if(strcmp(buf,exit)==0){ //若收到的是exit字符,则代表退出通信 printf(client is closed\n); close(new_fd); close(sockfd); exit(1); } printf(client:%s\n,buf); }/*while*/}void acceptconnect(void){ //接受客户端连接请求函数 struct sockaddr_in their_addr; int sin_size; sin_size = sizeof(struct sockaddr_in); if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1){ perror(accept); exit(1); } printf(server:got connection from %s\n,inet_ntoa(their_addr.sin_addr)); /*创建子线程,用于接收信息*/ if((pthread_create(&recthread,null,(void*)recmessage,null)) != 0){ printf(create thread error!\r\n); exit(1); }}int main(void){ struct sockaddr_in my_addr; /*创建套接字*/ if((sockfd = socket(af_inet,sock_stream,0)) == -1){ perror(socket); exit(1); } /*初始化sockaddr_in结构体相关参数*/ my_addr.sin_family = af_inet; my_addr.sin_port = htons(myport); my_addr.sin_addr.s_addr = inaddr_any; bzero(&(my_addr.sin_zero),8); /*绑定端口与套接字*/ if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) == -1){ perror(bind); exit(1); } /*监听客户端套接字*/ if(listen(sockfd,backlog)== -1){ perror(listen); exit(1); } printf(listening...\n); /*创建子线程,用于接收信息*/ if((pthread_create(&accthread,null,(void*)acceptconnect,null))!=0){ printf(create thread error!\n); exit(1); } while(1){ char msg[maxdatasize]; scanf(%s,msg); if(send(new_fd,msg,strlen(msg),0) == -1){ //发送信息,与客户端交流 perror(send); exit(1); } if(strcmp(msg,exit) ==0){ printf(byebye\n); close(new_fd); close(sockfd); exit(1); } }/*while*/ return 0;}/*main*/
2.客户端
/*tcpclient.c 2010.9.1 by yyg*/#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>#include <pthread.h>#include <netdb.h>#define port 3490#define backlog 10#define maxdatasize 1024int sockfd;pthread_t recthread;/*接收信息函数*/void recmessage(void){ while(1){ int numbytes; char buf[maxdatasize]; if((numbytes = recv(sockfd,buf,maxdatasize,0))==-1){ perror(recv); exit(1); } buf[numbytes]='\0'; if(strcmp(buf,exit)==0){ printf(server is closed\n); close(sockfd); exit(1); } printf(server:%s\n,buf); }/*while*/}int main(int argc,char *argv[]){ struct hostent *he; struct sockaddr_in their_addr; /*客户端输入方式:./client 172.31.100.236,若无输入后面ip地址,会提示错误*/ if(argc != 2){ fprintf(stderr,usage:client hostname\n); exit(1); } /*获取主机ip地址*/ if((he = gethostbyname(argv[1])) == null){ herror(gethostbyname); exit(1); } /*创建套接字*/ if((sockfd = socket(af_inet,sock_stream,0)) == -1){ perror(socket); exit(1); } /*初始化sockaddr_in结构体*/ their_addr.sin_family = af_inet; their_addr.sin_port = htons(port); their_addr.sin_addr = *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero),8); /*向服务器发送连接请求*/ if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1){ perror(connect); exit(1); } /*创建子线程,用于接收信息*/ if((pthread_create(&recthread,null,(void*)recmessage,null))!= 0){ printf(create thread error!\r\n); exit(1); } /*发送信息。接收发送信息用的是同一端口,都 是sockfd*/ while(1){ char msg[maxdatasize]; scanf(%s,msg); if(send(sockfd,msg,strlen(msg),0) == -1){ perror(send); exit(1); } if(strcmp(msg,exit) ==0){ printf(byebye\n); close(sockfd); exit(1); } }/*while*/ return 0;}
运行结果:
终端1:
[root@localhost net]# ./tcpserverserver:got connection from 172.31.100.236hello,world! client:helloclient:xiaolianclient:iouokexitbyebye
终端2:
[root@localhost net]# ./tcpclient 172.31.100.236server:hello,world!helloxiaolian iouserver:okserver is closed
以上就是linux socket怎么实现使用线程独立收发消息的详细内容。