unix socket网络编程TCP简单例子
admin
2023-02-04 20:40:03
0次

 

  1. server.c 
  2.  
  3. #include <sys/types.h>         
  4. #include <sys/socket.h> 
  5. #include <stdio.h> 
  6. #include <stdlib.h> 
  7. #include <string.h> 
  8. #include <arpa/inet.h> 
  9. #include <stdio.h> 
  10. #include <unistd.h> 
  11.  
  12.  
  13.  
  14.  
  15. int main(int argc, char** argv) 
  16. { 
  17.     int ret; 
  18.      
  19. //创建socket文件 
  20.     int sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  21.     if(sockfd == -1) 
  22.     { 
  23.         perror("socket\n"); 
  24.         exit(1); 
  25.     } 
  26.     printf("socket_fd = %d\n",sockfd); 
  27.      
  28. //重复使用本地址与socket文件进行绑定,如果不设置系统,会保留此连接直到最后一引用才释放,即进程结束后系统需要几分钟后才能重新进行绑定 
  29.     int i = 1; 
  30.     ret = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); 
  31.     if(ret) 
  32.     { 
  33.         perror("setsockopt\n"); 
  34.         exit(1);     
  35.     } 
  36.     printf("setsockopt complete!\n"); 
  37. //创建服务器socket地址sock_addr 
  38.     struct sockaddr_in server_addr; 
  39.     server_addr.sin_family = AF_INET; 
  40.     server_addr.sin_port = htons(4444); 
  41.     //地址指定INADDR_ANY表示可以接收安装在系统里面所有网卡的数据包 
  42.     server_addr.sin_addr.s_addr = INADDR_ANY; 
  43.     memset(server_addr.sin_zero, 8, 8); 
  44.      
  45. //将socket与地址进行绑定,这样可以使所有发向端口4444及协议为IPV4数据包指向socket文件 
  46.     ret =  bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr)); 
  47.     if(ret) 
  48.     { 
  49.         perror("bind\n"); 
  50.         exit(1);     
  51.     } 
  52.     printf("bind complete!\n"); 
  53.      
  54. //监听连接到该socket上请求,不会发生阻塞行为,以下设置队列大小为1,即队列满的时候其它连接会被拒绝连接 
  55.     ret = listen(sockfd, 10); 
  56.     if(ret) 
  57.     { 
  58.         perror("listen\n"); 
  59.         exit(1);     
  60.     } 
  61.     printf("listen complete!\n"); 
  62.      
  63. //接收连接请求并建立连接, 如果没有连接请求 accept会一址阻塞,直到有请求来 
  64.     struct sockaddr_in client_addr; 
  65.     int client_fd; 
  66.     socklen_t len = sizeof(struct sockaddr); 
  67.     client_fd = accept(sockfd, (struct sockaddr*)&client_addr, &len); 
  68.     if(client_fd == -1) 
  69.     { 
  70.         perror("bind\n"); 
  71.         exit(1);     
  72.     } 
  73.     printf("accept complete!\n"); 
  74.      
  75. //请取client发来的信息 
  76.  
  77.     char buf[100]; 
  78.     ssize_t readnum; 
  79.     memset(buf,100,0);
  80.  
  81. //这里应该是客户端的socket文件描述符 
  82.     readnum = recv(client_fd, (void*)buf, 100, MSG_WAITALL); 
  83.     //清空标准输出 
  84.     fflush(stdout); 
  85.     printf("received:%s\nnumber byte:%d\n",buf,strlen(buf)); 
  86.      
  87.      
  88. //发送信息到用户端 
  89.  
  90.     ssize_t sendnum; 
  91.     char content[100]="\"server:received the data!\""; 
  92.     sendsendnum = send(client_fd, content, 100, 0); 
  93.     printf("reply:%s\nnumber byte:%d\n",content,sendnum); 
  94.      
  95. // 关闭socket文件    
  96.     close(sockfd); 
  97.     close(client_fd); 
  98.      
  99.     return 0; 
  100. } 
  101.  
  102.  
  103.  
  104. client.c 
  105.  
  106. #include <sys/types.h>         
  107. #include <sys/socket.h> 
  108. #include <stdio.h> 
  109. #include <stdlib.h> 
  110. #include <string.h> 
  111. #include <arpa/inet.h> 
  112. #include <stdio.h> 
  113. #include <unistd.h> 
  114. #include <arpa/inet.h> 
  115.  
  116.  
  117.  
  118.  
  119.  
  120. int main(int argc, char** argv) 
  121. { 
  122.     int ret; 
  123.      
  124. //创建socket文件 
  125.     int sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  126.     if(sockfd == -1) 
  127.     { 
  128.         perror("socket\n"); 
  129.         exit(1); 
  130.     } 
  131.     printf("socket_fd = %d\n",sockfd); 
  132.      
  133. //创建服务器socket地址sock_addr 
  134.     struct sockaddr_in server_addr; 
  135.     server_addr.sin_family = AF_INET; 
  136.     server_addr.sin_port = htons(4444); 
  137.     //将字符串地址转换成网络地址,有两种方法 
  138.     inet_pton(AF_INET, "127.0.0.1", (void*)&server_addr.sin_addr.s_addr);//IPV4 IPV6可用 
  139.     //server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//只能转IPV4 
  140.     memset(server_addr.sin_zero, 8, 0); 
  141.  
  142. //连接服务端 
  143.     ret = connect(sockfd, (struct sockaddr*)&server_addr,sizeof(struct sockaddr)); 
  144.     if(ret == -1) 
  145.     { 
  146.         perror("connect\n"); 
  147.         exit(1);         
  148.     } 
  149.     printf("connect complete!\n"); 
  150.      
  151. //发送信息 
  152.     char content[100] = "\"hello,i am client!\""; 
  153.     ssize_t sendsendnum = send(sockfd, content, strlen(content)+1, 0); 
  154.     printf("send complete\nnumber byte:%d\ncontent:%s\n",sendnum,content); 
  155.      
  156. //收信息 
  157.     char buf[100]; 
  158.     ssize_t readnum; 
  159.     memset(buf,100,0); 
  160.     readnum = recv(sockfd, (void*)buf, 100, MSG_WAITALL); 
  161.     //清空标准输出 
  162.     fflush(stdout); 
  163.     printf("received:%s\nnumber byte:%d\n",buf,strlen(buf)); 
  164.      
  165. //关闭socket 
  166.     close(sockfd); 
  167.     return 0; 
  168. } 

 

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...