[资料]第5节 Hi3861 网络编程,TCP服务器

阅读量0
0
8
鸿蒙系统的TCP协议栈是lwIP,支持socket接口编程。
我们只需要导入对应的头文件。

#include "lwip/sockets.h"



以下是TCP代码部分,完整的代码见附件。

  1. #define SERVER_PORT_TCP                        6666
  2. #define TCP_BACKLOG 10


  3. /* 在sock_fd 进行监听,在 new_fd 接收新的链接 */
  4. int sock_fd, new_fd;

  5. char recvbuf[512];
  6. char *buf = "hello! I'm server!";

  7. int tcp_demo(void)
  8. {

  9.         /* 自己的地址信息 */
  10.         struct sockaddr_in my_addr;
  11.         /*        连接者的地址信息*/
  12.         struct sockaddr_in their_addr;
  13.         int sin_size;

  14.         struct sockaddr_in *cli_addr;

  15.     printf("%s %d rn", __FILE__, __LINE__);

  16.     /* 1 、创建socket  */
  17.         if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  18.         {
  19.         printf("%s %d rn", __FILE__, __LINE__);
  20.                 perror("socket is errorrn");
  21.                 exit(1);
  22.         }

  23.     /* 主机字节顺序 */
  24.         /* 协议 */
  25.         my_addr.sin_family = AF_INET;
  26.         my_addr.sin_port = htons(6666);
  27.         /* 当前IP 地址写入 */
  28.         my_addr.sin_addr.s_addr = INADDR_ANY;

  29.         /* 将结构体其余的都清零 */
  30.         bzero(&(my_addr.sin_zero), 8);

  31.     printf("%s %d rn", __FILE__, __LINE__);
  32.         /* bind 绑定*/
  33.         if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
  34.         {
  35.         printf("%s %d rn", __FILE__, __LINE__);
  36.                 perror("bind is errorrn");
  37.                 exit(1);
  38.         }

  39.     printf("%s %d rn", __FILE__, __LINE__);
  40.         /* 开始监听 */
  41.         if(listen(sock_fd, TCP_BACKLOG) == -1)
  42.         {
  43.                 perror("listen is errorrn");
  44.                 exit(1);
  45.         }

  46.     printf("%s %d rn", __FILE__, __LINE__);
  47.         printf("start acceptn");

  48.     /* accept() 循环 */
  49.         while(1)
  50.         {
  51.                 sin_size = sizeof(struct sockaddr_in);

  52.         printf("%s %d rn", __FILE__, __LINE__);
  53.                 if((new_fd = accept(sock_fd, (struct sockaddr *)&their_addr, (socklen_t *)&sin_size)) == -1)
  54.                 {
  55.                         perror("accept");
  56.                         continue;
  57.                 }

  58.                 cli_addr = malloc(sizeof(struct sockaddr));

  59.                 printf("accept addrrn");

  60.                 if(cli_addr != NULL)
  61.                 {
  62.                         memcpy(cli_addr, &their_addr, sizeof(struct sockaddr));
  63.                 }

  64.                 //处理目标
  65.                 ssize_t ret;
  66.                

  67.                 while(1)
  68.                 {
  69.             printf("%s %d rn", __FILE__, __LINE__);
  70.                         if((ret = recv(new_fd, recvbuf, sizeof(recvbuf), 0)) == -1){
  71.                                 printf("recv error rn");
  72.                                 return -1;
  73.                         }
  74.                         printf("recv :rn");
  75.                         printf("%s", recvbuf);
  76.                         printf("rn");
  77.                         sleep(2);
  78.                         if((ret = send(new_fd, buf, strlen(buf) + 1, 0)) == -1)
  79.                         {
  80.                                 perror("send : ");
  81.                         }

  82.                         sleep(2);
  83.                 }

  84.                

  85.                 close(new_fd);

  86.         return 0;
  87.         }
  88. }
复制代码



tcp_demo.rar
(2.99 KB, 下载次数: 61)

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友