Linux 网络编程一:基本阻塞通信

来源:互联网 发布:萌鲸网络 编辑:程序博客网 时间:2024/04/30 01:33

基本流程

  • 服务器端
    • 声明句柄fd和网络地址sockaddr_in
    • 赋值sockaddr_in为服务器的端口和INADDR_ANY表明监听任意连接
    • 调用socket函数创建一个socket并赋值句柄为fd
    • 调用bind函数将句柄fd和网络地址sockaddr_in进行绑定
    • 调用listen函数开始监听客户端的连接
    • 调用accept函数获得连接的客户端
    • 调用send recv函数进行数据发送和操作
  • 客户端
    • 声明句柄fd和网络地址server_addr 
    • 赋值server_addr为服务器的ip和port
    • 调用connect进行连接
    • 调用send recv函数进行数据的发送和接收操作

代码分析(转载)

该代码转载自点击打开链接
  • Client 端代码:
--------------------------------------------------------------
[cpp] view plaincopy
  1. /* sockclnt.c*/  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #include <sys/types.h>  
  5. #include <sys/socket.h>  
  6. #include <netinet/in.h> /*for struct sockaddr_in*/  
  7.   
  8. #define DEST_IP   "65.52.207.217"  
  9. #define DEST_PORT 4000  
  10.   
  11. int main()  
  12. {  
  13.   int res;  
  14.   int sockfd;  
  15.   struct sockaddr_in dest_addr;  
  16.   
  17.   char *msg = "Hello world\n";  
  18.   int len, bytes_sent;  
  19.   
  20.   /* 取得一个套接字*/  
  21.   sockfd = socket(AF_INET, SOCK_STREAM, 0);  
  22.   if (sockfd == -1) {  
  23.     perror("socket()");  
  24.     exit(1);  
  25.   }  
  26.   
  27.   /* 设置远程连接的信息*/  
  28.   dest_addr.sin_family = AF_INET;                 /* 注意主机字节顺序*/  
  29.   dest_addr.sin_port = htons(DEST_PORT);          /* 远程连接端口, 注意网络字节顺序*/  
  30.   dest_addr.sin_addr.s_addr = inet_addr(DEST_IP); /* 远程 IP 地址, inet_addr() 会返回网络字节顺序*/  
  31.   bzero(&(dest_addr.sin_zero), 8);                /* 其余结构须置 0*/  
  32.   
  33.   /* 连接远程主机,出错返回 -1*/  
  34.   res = connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in));  
  35.   if (res == -1) {  
  36.     perror("connect()");  
  37.     exit(1);  
  38.   }  
  39.   
  40.   len = strlen(msg);  
  41.   bytes_sent = send(sockfd, /* 连接描述符*/  
  42.                     msg,    /* 发送内容*/  
  43.                     len,    /* 发关内容长度*/  
  44.                     0);     /* 发送标记, 一般置 0*/  
  45.   
  46.   /* 关闭连接*/  
  47.   close(sockfd);  
  48. }  


  • Server 端的代码:
-----------------------------------------------------------------------------------------
[cpp] view plaincopy
  1. /* socksrv.c*/  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <string.h>  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <netinet/in.h> /* for struct sockaddr_in*/  
  8.   
  9. #define BACKLOG 10  
  10. #define MYPORT  4000  
  11.   
  12. int main()  
  13. {  
  14.   char *addr;  
  15.   int sockfd;  
  16.   int new_fd;  
  17.   struct sockaddr_in my_addr, their_addr;  
  18.   
  19.   int res;  
  20.   int sin_size;  
  21.   
  22.   char *buf;  
  23.   /* 取得套接字描述符*/  
  24.   sockfd = socket(AF_INET,     /* domain*/  
  25.                   SOCK_STREAM, /* type*/  
  26.                   0);          /* protocol*/  
  27.   
  28.   if (sockfd == -1) {  
  29.     perror("socket");  
  30.     exit(1);  
  31.   }  
  32.   
  33.   /* Init sockaddr_in */  
  34.   my_addr.sin_family = AF_INET;                /* 注意: 应使用主机字节顺序*/  
  35.   my_addr.sin_port = htons(MYPORT);            /* 注意: 应使用网络字节顺序*/  
  36.   my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 使用自己的 IP 地址 */  
  37.   bzero(&(my_addr.sin_zero), 8);               /* 结构的其余的部分须置 0*/  
  38.   
  39.   /* 指定一个套接字使用的地址及端口*/  
  40.   res = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));  
  41.   if (res == -1) {  
  42.     perror("bind");  
  43.     exit(1);  
  44.   }  
  45.   
  46.   /* 监听请求, 等待连接*/  
  47.   res = listen(sockfd,   
  48.                BACKLOG);  /* 未经处理的连接请求队列可容纳的最大数目*/                 
  49.   if (res == -1) {  
  50.     perror("listen");  
  51.     exit(1);  
  52.   }  
  53.   
  54.   /* 接受对方的连接请求, 建立连接,返回一个新的连接描述符. 
  55.    * 而第一个套接字描述符仍在你的机器上原来的端口 listen() 
  56.    */  
  57.   sin_size = sizeof(struct sockaddr_in);  
  58.   new_fd = accept(sockfd, (void *)&their_addr, &sin_size);  
  59.   
  60.   buf = (char *)malloc(255);  
  61.   if (buf == NULL) {  
  62.     printf("malloc failed\n");  
  63.     exit(1);  
  64.   }  
  65.   
  66.   /* 接受对方发来的数据*/  
  67.   res = recv(new_fd, buf, 255, 0);  
  68.   if (res == -1) {  
  69.     perror("recv()");  
  70.     exit(1);  
  71.   }  
  72.   
  73.   /* 关闭本次连接*/  
  74.   close(new_fd);  
  75.   
  76.   /* 关闭系统监听*/  
  77.   close(sockfd);  
  78.   
  79.   printf("recv data:%s\n", buf);  
  80.   free(buf);  
  81.   return 0;  

0 0
原创粉丝点击