socket example

自闭症网瘾萝莉.ら 提交于 2020-03-25 03:16:27

for code copy in the future

simple server and client 

may be useful for copy in the future

 

server:

  1. #include <errno.h>  
  2. #include "sys/types.h"  
  3. #include "sys/socket.h"  
  4. #include "sys/stat.h"  
  5. #include "unistd.h"  
  6. #include <netinet/in.h>  
  7. //#include <arpa/inet.h>  
  8. #include <fcntl.h>  
  9.   
  10. #define SERVER_PORT (56738)  
  11. #define SERVER_IP "127.0.0.1"  
  12. #define LOG printf  
  13.   
  14. static void handle_crashing_process_new(int fd)  
  15. {  
  16.     int n;  
  17.     unsigned int tid;  
  18.     int length = getpid();  
  19.     int retry = 30;  
  20.     printf("handle_crashing_process_new in\n");  
  21.     while((n = read(fd, &tid, sizeof(unsigned))) != sizeof(unsigned)) {  
  22.         if(errno == EINTR) continue;  
  23.         if(errno == EWOULDBLOCK) {  
  24.             if(retry-- > 0) {  
  25.                 usleep(100 * 1000);  
  26.                 continue;  
  27.             }  
  28.             LOG("timed out reading tid\n");  
  29.             goto done;  
  30.         }  
  31.         //LOG("read failure %s\n", strerror(errno));  
  32.         //goto done;  
  33.     }  
  34.     printf("getpid =%d\n",tid);  
  35.     n = send(fd, &length,sizeof(length),0);  
  36.     if(n < 0){   
  37.         printf("send failure %s\n", strerror(errno));  
  38.         goto done;  
  39.     }  
  40.     done:  
  41.         return;  
  42. }  
  43. int main(int argc, char** argv)  
  44. {  
  45.     int s;  
  46.     struct sockaddr_in addr;    
  47.     //bzero(&addr,sizeof(addr));  
  48.   
  49.     addr.sin_family = AF_INET;  
  50.     addr.sin_port = htons(SERVER_PORT);  
  51.     addr.sin_addr.s_addr = inet_addr(SERVER_IP);  
  52.       
  53.     s = socket(AF_INET,  
  54.             SOCK_STREAM, 0);  
  55.     if(s < 0){   
  56.         printf("socket failure %s\n", strerror(errno));  
  57.         goto done;  
  58.     }  
  59.     //fcntl(s, F_SETFD, FD_CLOEXEC);  
  60.   
  61.     //LOG("debuggerd: " __DATE__ " " __TIME__ "\n");  
  62.     //printf("pid=%d,tid=%d\n",getpid(),gettid());  
  63.       
  64.     if(bind(s, (struct sockaddr *) &addr, sizeof(struct sockaddr_in)) < 0)   
  65.     {    
  66.         printf("bind error %s\n",strerror(errno));  
  67.         goto done;      
  68.     }  
  69.       
  70.     if (listen(s,10))  
  71.     {  
  72.         printf("listen error %s\n",strerror(errno));  
  73.         goto done;      
  74.     }  
  75.       
  76.     for(;;) {  
  77.         struct sockaddr addr;  
  78.         socklen_t alen;  
  79.         int fd;  
  80.   
  81.         alen = sizeof(addr);  
  82.         printf("before accept\n");  
  83.         fd = accept(s, &addr, &alen);  
  84.         printf("after accept\n");  
  85.         if(fd < 0) {  
  86.             printf("accept failed: %s\n", strerror(errno));  
  87.             continue;  
  88.         }  
  89.         //fcntl(fd, F_SETFD, FD_CLOEXEC);  
  90.         handle_crashing_process_new(fd);  
  91.         close(fd);  
  92.         fd = -1;  
  93.     }  
  94.     done:  
  95.     close(s);  
  96.       
  97.     return 0;  
  98. }  


client

 

  1. #include <stdio.h>  
  2. #include <errno.h>  
  3. #include "sys/types.h"  
  4. #include "sys/socket.h"  
  5. #include "sys/stat.h"  
  6. #include "unistd.h"  
  7. //#include <sys/syscall.h>    
  8. #include <netinet/in.h>  
  9. //#include <arpa/inet.h>  
  10. #include <fcntl.h>  
  11.   
  12.     
  13. #define gettid() ((pid_t) syscall(SYS_gettid))   
  14. #define SERVER_PORT 56738  
  15. #define SERVER_IP "127.0.0.1"  
  16. #define LOG printf  
  17.   
  18.  void sendPidtoServer()  
  19. {  
  20.     int s;  
  21.     int pid, tid;  
  22.     int datalen=0,retry=30;  
  23.     printf("333 pid\n");  
  24.     pid=getpid();  
  25.     tid=pid;//gettid();  
  26.     int n = 0;  
  27.     printf("pid=%d\n",pid);  
  28.     struct sockaddr_in addr;    
  29.     //bzero(&addr,sizeof(addr));  
  30.   
  31.     addr.sin_family = AF_INET;  
  32.     addr.sin_port = htons(SERVER_PORT);  
  33.     addr.sin_addr.s_addr = inet_addr(SERVER_IP);  
  34.       
  35.     s = socket(AF_INET, SOCK_STREAM, 0);  
  36.     if (s<0)  
  37.     {  
  38.         printf(" socket error %s", strerror(errno));  
  39.         goto done;  
  40.     }  
  41.     n= connect(s,(struct sockaddr*)(&addr),sizeof(addr));  
  42.     if (n!=0)  
  43.     {  
  44.         printf(" connect error %s", strerror(errno));  
  45.         goto done;  
  46.     }  
  47.     n = send(s,&tid,sizeof(tid),0);  
  48.     if (n<0)  
  49.     {  
  50.         printf(" connect error %s\n", strerror(errno));  
  51.         goto done;  
  52.     }  
  53.     while((n = read(s, &datalen, sizeof(datalen))) != sizeof(datalen)) {  
  54.         if(errno == EINTR) continue;  
  55.         if(errno == EWOULDBLOCK) {  
  56.             if(retry-- > 0) {  
  57.                 usleep(100 * 1000);  
  58.                 continue;  
  59.             }  
  60.             LOG("timed out reading tid\n");  
  61.             goto done;  
  62.         }  
  63.     }      
  64.     printf("get length=%d\n",datalen);  
  65.     sleep(1);  
  66.     done:  
  67.     close(s);  
  68. }  
  69.   
  70. int main(int argc, char** argv)  
  71. {  
  72.     printf("socket client\n");  
  73.     sendPidtoServer();  
  74.     return 0;  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!