ubuntu环境下实现 多线程的socket(tcp) 通信
程序员文章站
2022-07-05 15:38:07
改改就是个小型局域网聊天 服务器端: 1 // File Name: process_server.c 2 // Author: jiujue 3 // Created Time: 2019年03月10日 星期日 20时29分18秒 4 5 #include 6 #include< ......
改改就是个小型局域网聊天
服务器端:
1 // file name: process_server.c 2 // author: jiujue 3 // created time: 2019年03月10日 星期日 20时29分18秒 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<time.h> 9 #include<math.h> 10 #include <unistd.h> 11 #include <sys/socket.h> 12 #include <ctype.h> 13 #include <sys/types.h> 14 #include <arpa/inet.h> 15 #include <signal.h> 16 #include <sys/wait.h> 17 #include <errno.h> 18 #include <pthread.h> 19 20 typedef struct sock_info 21 { 22 int m_fd; 23 pthread_t m_pthid; 24 struct sockaddr_in m_addr; 25 26 }sock_info; 27 28 void* works(void* arg) 29 { 30 sock_info *c_info = (sock_info*)arg; 31 32 //obtain client info 33 int client_port = ntohs(c_info->m_addr.sin_port); 34 char client_ip[64]; 35 36 socklen_t buf_len = sizeof(client_ip); 37 38 inet_ntop(af_inet, (void*)&c_info->m_addr.sin_addr.s_addr,client_ip,buf_len); 39 40 printf("\t\t\t\t ip %s, port %d,connect successful\n",client_ip,client_port); 41 42 while(1) 43 { 44 char buf[1024] = {0}; 45 int read_len = read(c_info->m_fd, buf, sizeof(buf)); 46 if(read_len > 0) 47 { 48 buf[read_len+1]='\n'; 49 printf("->-> obtain if of ,ip %s, port %d, send info: %s\n",client_ip,client_port,buf); 50 write(c_info->m_fd,buf,strlen(buf)); 51 } 52 else if(0 == read_len) 53 { 54 printf("\t\t\t\t ip %s, port %d, disconnect\n",client_ip,client_port); 55 break; 56 } 57 else if(-1 == read_len) 58 { 59 perror("read error"); 60 exit(1); 61 } 62 } 63 64 return null; 65 } 66 67 int main(int argc, const char* argv[]) 68 { 69 if(argc < 3) 70 { 71 printf("eg: ./app ip port\n"); 72 exit(1); 73 } 74 short port = atoi(argv[2]); 75 76 int lfd = socket(af_inet, sock_stream, 0); 77 if(-1 == lfd) 78 { 79 perror("socket error"); 80 exit(1); 81 } 82 83 struct sockaddr_in serv; 84 serv.sin_port = htons(port); 85 serv.sin_family = af_inet; 86 inet_pton(af_inet, argv[1], &serv.sin_addr.s_addr); 87 88 int res = bind(lfd, (struct sockaddr *)&serv, sizeof(serv)); 89 if(-1 == res) 90 { 91 perror("bind error"); 92 exit(1); 93 } 94 95 res = listen(lfd, 128); 96 if(-1 == res) 97 { 98 perror("listen error"); 99 exit(1); 100 } 101 102 103 while(1) 104 { 105 printf("\a wait accepting...\n"); 106 struct sockaddr_in client_add; 107 108 socklen_t len = sizeof(client_add); 109 110 int cfd = accept(lfd,(struct sockaddr*)&client_add, &len); 111 112 while(-1 == cfd && cfd == eintr) 113 { 114 cfd = accept(lfd,(struct sockaddr*)&client_add, &len); 115 } 116 117 // supply son pthread info 118 sock_info* s_info =(sock_info*)malloc(sizeof(sock_info)); 119 120 s_info->m_fd = cfd; 121 s_info->m_addr = client_add; 122 123 int res = pthread_create(&s_info->m_pthid, null, works, (void*)s_info); 124 if(res == -1) 125 { 126 perror("pthread_creat error"); 127 exit(1); 128 } 129 pthread_detach(s_info->m_pthid); 130 131 } 132 133 close(lfd); 134 return 0 ; 135 }
客户端:
1 // file name: socket_client.c 2 // author: jiujue 3 // created time: 2019年03月09日 星期六 13时00分05秒 4 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<time.h> 9 #include<math.h> 10 #include <unistd.h> 11 #include <sys/socket.h> 12 #include <arpa/inet.h> 13 14 15 int main(int argc, const char* argv[]) 16 { 17 18 if(argc < 3) 19 { 20 printf("eg: ./app ip port\n"); 21 exit(1); 22 } 23 int port = atoi(argv[2]); 24 25 int fd = socket(af_inet, sock_stream, 0); 26 if(-1 == fd) 27 { 28 perror("socket error"); 29 exit(1); 30 } 31 32 struct sockaddr_in serv; 33 34 serv.sin_port = htons(port); 35 serv.sin_family = af_inet; 36 inet_pton(af_inet, argv[1], &serv.sin_addr.s_addr); 37 38 socklen_t len = sizeof(serv); 39 int res = connect(fd,(struct sockaddr *) &serv, len); 40 if(-1 == res) 41 { 42 perror("connect error"); 43 exit(1); 44 } 45 printf("connectt server successful!!\n"); 46 47 while(1) 48 { 49 printf("please input string\n>>"); 50 char buf[1024]; 51 fgets(buf,sizeof(buf),stdin); 52 write(fd, buf, strlen(buf)); 53 printf("send buf: %s\n",buf); 54 len = read(fd,buf,(buf)); 55 if(len > 0) 56 { 57 printf("recv buf: %s\n",buf); 58 }else if(len == 0) 59 { 60 printf("serer disconnect \n"); 61 break; 62 } 63 else if(-1 == len) 64 { 65 perror("read errror"); 66 exit(1); 67 }else 68 { 69 printf("i no now\n"); 70 } 71 } 72 73 close(fd); 74 return 0 ; 75 }
结语:有问题欢迎提在下方 ,本人在校学生,时间较为充裕, 有时间会回复的。
/* 原创文章 转载请附上原链接: https://www.cnblogs.com/jiujue/p/10513859.html */
推荐阅读
-
labview环境下Tcp/Ip实现通信
-
labview环境下Tcp/Ip实现通信
-
Java Socket实现基于TCP和UDP多线程通信
-
ubuntu环境下实现 多线程的socket(tcp) 通信
-
linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)
-
利用Qt/C++在腾讯云/阿里云服务器搭建TCP/IP协议实现网络通信以及Qt在linux下的安装和程序打包踩坑(详解)
-
基于Java的Socket类Tcp网络编程实现实时聊天互动程序(二):Tcp通信的过程及代码编写
-
基于TCP的socket编程实现client和server通信
-
socket实现客户端与服务端之间的Tcp通信
-
【Socket网络通信】利用TCP/IP协议实现从服务端的文件中读取数据打印到客户端的控制台,服务端对客户端输入过来的数据做出响应...