代码实现
1、服务器端
- /*tcpserver.c 2011.9.1 by yyg*/#include #include #include #include #include #include #include #include #include #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 #include #include #include #include #include #include #include #include #include #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怎么实现使用线程独立收发消息的详细内容,更多请关注【创想鸟】其它相关文章!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。