Linux socket之二:面向连接的socket通信实现

本文介绍了一个简单的Socket编程示例,包括服务器端与客户端程序。通过创建socket、设置地址、监听和接受连接等步骤,实现数据的发送与接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 socket也即套接字接口,实际上也就是网络上的通信节点。使用者或者应用程序只要连接到socket便可以和网络上任何一个通信端点连接,传递数据。LINUX中,程序员可以不必关心通信协议而专注应用程序开发。根据数据传送方式,可以把socket分成面向连接的数据流通信和无连接的数据报通信。通信过程如下:

                                                           

         函数实例:

A,服务器端程序echo_serv.c

[cpp]  view plain  copy
  1. #include <sys/types.h>  
  2. #include <sys/socket.h>  
  3. #include <netinet/in.h>  
  4. #include <arpa/inet.h>  
  5. #include <unistd.h>  
  6. #include <stdio.h>  
  7. #include <errno.h>  
  8.   
  9. #define EHCO_PORT 8080  
  10. #define MAX_CLIENT_NUM  10  
  11.   
  12. void * memsets (void *s, int c, int count)  
  13. {  
  14.     char *xs = s;  
  15.   
  16.     while (count--)  
  17.         *xs++ = c;  
  18.     return s;  
  19. }  
  20. #define bzero(b, len)       memsets((b), '\0', (len))  
  21.   
  22. int main()  
  23. {  
  24.     int sock_fd;  
  25.     struct sockaddr_in  serv_addr;  
  26.     int clientfd;  
  27.     struct sockaddr_in  clientAddr;  
  28.     char    buff[101];  
  29.     socklen_t   len;  
  30.     int closing = 0;  
  31.     int n;  
  32.       
  33. /*create socket*/  
  34.     sock_fd = socket(AF_INET,SOCK_STREAM,0);  
  35.     if(sock_fd == -1){  
  36.         printf("create socket error! \r\n");      
  37.         return 0;  
  38.     }else{  
  39.         printf("succress to create socket %d \r\n",sock_fd);  
  40.     }  
  41.       
  42. /*setting server addr*/  
  43.     bzero(&serv_addr,sizeof(serv_addr));  
  44.     serv_addr.sin_family = AF_INET;  
  45.     serv_addr.sin_port = htons(EHCO_PORT);  
  46.     serv_addr.sin_addr.s_addr = htons(INADDR_ANY);   //INADDR_ANY表示可以跟任何主机通信  
  47.     bzero(&(serv_addr.sin_zero), 8);  
  48.   
  49. /*bind addr with soket*/      
  50.     if(bind(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))!=0){  
  51.         printf("bind address fail! %d \r\n",errno);  
  52.         close(sock_fd);  
  53.         return 0;  
  54.     }else{  
  55.         printf("success to bind address \r\n");  
  56.     }  
  57.   
  58. /*setting listener*/      
  59.     if(listen(sock_fd,MAX_CLIENT_NUM)!=0){  
  60.         printf("listen socket error \r\n");  
  61.         close(sock_fd);  
  62.         return 0;  
  63.     }else{  
  64.         printf("success to bind listen \r\n");  
  65.     }  
  66.   
  67. /*create another socket*/     
  68.     len = sizeof(clientAddr);  
  69.     clientfd = accept(sock_fd,(struct sockaddr*)&clientAddr,&len);   //获得连接上的客户端的socket  
  70.     if(clientfd<=0){  
  71.         printf("accept error !\r\n");  
  72.         close(sock_fd);  
  73.         return 0;         
  74.     }  
  75.   
  76. /*get data from client user*/     
  77.     while((n = recv(clientfd,buff,100,0))>0){  
  78.         buff[n] = '\0';  
  79.     printf("number of receive bytes = %d data = %s \n",n,buff);  
  80.   
  81.     fflush(stdout);  
  82.     send(clientfd,buff,n,0);  
  83.     if(strncmp(buff,"quit",4) == 0)  
  84.         break;  
  85.     }  
  86.   
  87.     close(clientfd);  
  88.     close(sock_fd);  
  89.   
  90.     return 0;  
  91. }  

 B,客户端程序 echo_client.c

[cpp]  view plain  copy
  1. #include <sys/types.h>  
  2. #include <sys/socket.h>  
  3. #include <netinet/in.h>  
  4. #include <arpa/inet.h>  
  5. #include <unistd.h>  
  6. #include <stdio.h>  
  7. #include <errno.h>  
  8.   
  9. #define     EHCO_PORT 8080  
  10. #define MAX_COMMAND 5  
  11.   
  12. void * memsets (void *s, int c, int count)  
  13. {  
  14.     char *xs = s;  
  15.   
  16.     while (count--)  
  17.         *xs++ = c;  
  18.     return s;  
  19. }  
  20. #define bzero(b, len)       memsets((b), '\0', (len))  
  21.   
  22. int main()  
  23. {  
  24.     int sock_fd;  
  25.     struct sockaddr_in      serv_addr;  
  26.     char *buff[MAX_COMMAND] = {"abc","def","test","hello","quit"};  
  27.     char tmp_buf[100];  
  28.     socklen_t len;  
  29.     int n,i;  
  30.   
  31. /*create socket*/     
  32.     sock_fd = socket(AF_INET,SOCK_STREAM,0);  
  33.     if(sock_fd == -1){  
  34.         printf("create socket error! \r\n");      
  35.         return 0;  
  36.     }else{  
  37.         printf("succress to create socket %d \r\n",sock_fd);  
  38.     }  
  39.   
  40. /*setting server addr*/  
  41.     bzero(&serv_addr,sizeof(serv_addr));  
  42.     serv_addr.sin_family = AF_INET;  
  43.     serv_addr.sin_port = htons(EHCO_PORT);  
  44.     serv_addr.sin_addr.s_addr = htons(INADDR_ANY);     //INADDR_ANY表示可以跟任何主机通信  
  45.     bzero(&(serv_addr.sin_zero), 8);  
  46.   
  47. /*connect server*/  
  48.     if(connect(sock_fd,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1){  
  49.         printf("connect error \r\n");  
  50.         close(sock_fd);  
  51.         return 0;  
  52.     }  
  53.     printf("success connect to server \r\n");  
  54.   
  55. /*send and receive data*/  
  56.     for(i=0;i<MAX_COMMAND;i++){  
  57.         send(sock_fd,buff[i],100,0);  
  58.         n = recv(sock_fd,tmp_buf,100,0);  
  59.         tmp_buf[n] = '\0';  
  60.         printf("data send :%s receive :%s \n",buff[i],tmp_buf);  
  61.         if(0==strncmp(tmp_buf,"quit",4))  
  62.             break;  
  63.     }  
  64.     close(sock_fd);  
  65.     return 0;  
  66. }  

        分别使用不同的终端用gcc编译这两个程序并执行,得到通信结果。
服务器端结果客户端结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值