Linux下基于TCP的线程通信
来源:互联网 发布:皮皮四川麻将源码 编辑:程序博客网 时间:2024/06/05 07:21
Linux下基于TCP的线程通信
/**server.c**/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <pthread.h>#define BACKLOG 10#define MYPORT 8888#define SIZE 1024int sfd, new_fd;void receive_message(){int nbytes;char buf[SIZE];while(1){bzero(buf, SIZE);nbytes = recv(new_fd, buf, SIZE, 0);if(nbytes<=0){perror("recv");exit(1);}buf[nbytes] = '\0';if(strcmp(buf, "quit") == 0){printf("Client is quit\n");close(new_fd);close(sfd);exit(1);}printf("Receive message from cLient: %s\n", buf);}}void accept_connect(){int sin_size;int ret = 0;pthread_t tid;struct sockaddr_in client_addr;sin_size = sizeof(struct sockaddr_in);new_fd = accept(sfd, (struct sockaddr*)&client_addr, &sin_size);if(-1 == new_fd){perror("accept");exit(1);}printf("Server get connected from %s\n", inet_ntoa(client_addr.sin_addr));ret = pthread_create(&tid, NULL, (void *)receive_message, NULL);if(ret != 0){printf("pthread create failed\n");exit(1);}}int main(){int ret=0;pthread_t tid;struct sockaddr_in myaddr;sfd = socket(AF_INET, SOCK_STREAM, 0);if(-1== sfd){perror("socket");close(sfd);exit(1);}bzero(&myaddr, sizeof(myaddr));myaddr.sin_family = AF_INET;myaddr.sin_port = htons(MYPORT);myaddr.sin_addr.s_addr = INADDR_ANY;if(bind(sfd, (struct sockaddr*)&myaddr, sizeof(struct sockaddr)) == -1){perror("bind()");close(sfd);exit(1);}if(listen(sfd, BACKLOG) == -1){perror("listen()");close(sfd);exit(1);}ret = pthread_create(&tid, NULL, (void *)accept_connect, NULL);if(0 != ret){printf("pthread create failed\n");exit(1);}char msg[SIZE];while(1){bzero(msg, SIZE);scanf("%s", msg);if(send(new_fd, msg, strlen(msg), 0) == -1){perror("send()");close(new_fd);exit(1);}if(strcmp(msg, "quit") == 0){printf("Byebye!\n");close(new_fd);close(sfd);exit(1);}}return 0;}
/**client.c**/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <netdb.h>#include <pthread.h>#define BACKLOG 10#define MYPORT 8888#define SIZE 1024int sfd;void receive_message(){int nbytes;char buf[SIZE];while(1){bzero(buf, SIZE);nbytes = recv(sfd, buf, SIZE, 0);if(nbytes<=0){perror("recv()");exit(1);}buf[nbytes] = '\0';if(strcmp(buf, "quit") == 0){printf("Server is quit\n");close(sfd);exit(1);}printf("Receive message from server: %s\n", buf);}}int main(int argc, char *argv[]){int ret=0;char msg[SIZE];pthread_t tid;struct sockaddr_in server_addr;struct hostent *hent;if(argc != 2){fprintf(stderr, "usage: <client hostname>\n");exit(1);}hent = gethostbyname(argv[1]);if(hent == NULL){perror("gethostbyname()");exit(1);}sfd = socket(AF_INET, SOCK_STREAM, 0);if(-1== sfd){herror("socket");close(sfd);exit(1);}server_addr.sin_family = AF_INET;server_addr.sin_port = htons(MYPORT);server_addr.sin_addr.s_addr = ((struct in_addr *)hent->h_addr)->s_addr;//server_addr.sin_addr.s_addr = inet_addr(argv[1]);bzero(&server_addr.sin_zero, 8);if(connect(sfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in))==-1){perror("connect()");close(sfd);exit(1);}ret = pthread_create(&tid, NULL, (void *)receive_message, NULL);if(0 != ret){printf("pthread create failed\n");exit(1);}while(1){bzero(msg, SIZE);scanf("%s", msg);if(send(sfd, msg, strlen(msg), 0) == -1){perror("send()");close(sfd);exit(1);}if(strcmp(msg, "quit") == 0){printf("Byebye!\n");close(sfd);exit(1);}}return 0;}
0 0
- Linux下基于TCP的线程通信
- linux下基于TCP简单的socket通信程序
- linux下基于TCP协议的socket通信
- Linux下的TCP通信
- Linux下的TCP通信
- Linux下的TCP通信
- Linux下的TCP通信
- Linux下的TCP通信
- Linux下的TCP通信
- 在Linux下基于tcp协议实现一个简单的通信
- Linux环境下的TCP/IP通信
- Unix系统下的基于TCP通信的聊天室
- 基于Linux下的TCP编程
- Linux下基于TCP的文件传输
- 基于Linux下的TCP编程
- 基于Linux下的TCP编程
- 基于Linux下的TCP编程
- 基于Linux下的TCP编程
- 常用不容易记住的css样式
- JSP的内置对象
- Motion camera 真人动作捕捉器
- 浅析_tmain()与main()的区别
- android listview 连续调用 getview问题分析及解决。
- Linux下基于TCP的线程通信
- MFC ListCtrl控件
- 【移动通信】运营商名称显示优先级
- 我对装饰者模式的理解
- strace和10046 研究一致读
- PHP各类别常用函数
- LBFGS公式推导
- 千里之行,始于足下
- C语言经典算法100例题目1-30