unix socket网络编程TCP简单例子

 

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

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/183389.html

(0)
上一篇 2021年11月2日
下一篇 2021年11月2日

相关推荐

发表回复

登录后才能评论