电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1261|回复: 1
收起左侧

第5节 Hi3861 网络编程,TCP服务器

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-10-2 23:56:39 | 显示全部楼层 |阅读模式
第5节 Hi3861 网络编程,TCP服务器, 鸿蒙系统的TCP协议栈是lwIP,支持socket接口编程。

我们只需要导入对应的头文件。



#include “lwip/sockets.h“







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




  •   
  • #define SERVER_PORT_TCP                        6666
      
  • #define TCP_BACKLOG 10
      

  •   

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

  •   
  • char recvbuf[512];
      
  • char *buf = “hello! I\“m server!“;
      

  •   
  • int tcp_demo(void)
      
  • {
      

  •   
  •         /* 自己的地址信息 */
      
  •         struct sockaddr_in my_addr;
      
  •         /*        连接者的地址信息*/
      
  •         struct sockaddr_in their_addr;
      
  •         int sin_size;
      

  •   
  •         struct sockaddr_in *cli_addr;
      

  •   
  •     printf(“%s %d \r\n“, __FILE__, __LINE__);
      

  •   
  •     /* 1 、创建socket  */
      
  •         if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
      
  •         {
      
  •         printf(“%s %d \r\n“, __FILE__, __LINE__);
      
  •                 perror(“socket is error\r\n“);
      
  •                 exit(1);
      
  •         }
      

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

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

  •   
  •     printf(“%s %d \r\n“, __FILE__, __LINE__);
      
  •         /* bind 绑定*/
      
  •         if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
      
  •         {
      
  •         printf(“%s %d \r\n“, __FILE__, __LINE__);
      
  •                 perror(“bind is error\r\n“);
      
  •                 exit(1);
      
  •         }
      

  •   
  •     printf(“%s %d \r\n“, __FILE__, __LINE__);
      
  •         /* 开始监听 */
      
  •         if(listen(sock_fd, TCP_BACKLOG) == -1)
      
  •         {
      
  •                 perror(“listen is error\r\n“);
      
  •                 exit(1);
      
  •         }
      

  •   
  •     printf(“%s %d \r\n“, __FILE__, __LINE__);
      
  •         printf(“start accept\n“);
      

  •   
  •     /* accept() 循环 */
      
  •         while(1)
      
  •         {
      
  •                 sin_size = sizeof(struct sockaddr_in);
      

  •   
  •         printf(“%s %d \r\n“, __FILE__, __LINE__);
      
  •                 if((new_fd = accept(sock_fd, (struct sockaddr *)&their_addr, (socklen_t *)&sin_size)) == -1)
      
  •                 {
      
  •                         perror(“accept“);
      
  •                         continue;
      
  •                 }
      

  •   
  •                 cli_addr = malloc(sizeof(struct sockaddr));
      

  •   
  •                 printf(“accept addr\r\n“);
      

  •   
  •                 if(cli_addr != NULL)
      
  •                 {
      
  •                         memcpy(cli_addr, &their_addr, sizeof(struct sockaddr));
      
  •                 }
      

  •   
  •                 //处理目标
      
  •                 ssize_t ret;
      
  •                
      

  •   
  •                 while(1)
      
  •                 {
      
  •             printf(“%s %d \r\n“, __FILE__, __LINE__);
      
  •                         if((ret = recv(new_fd, recvbuf, sizeof(recvbuf), 0)) == -1){
      
  •                                 printf(“recv error \r\n“);
      
  •                                 return -1;
      
  •                         }
      
  •                         printf(“recv :\r\n“);
      
  •                         printf(“%s“, recvbuf);
      
  •                         printf(“\r\n“);
      
  •                         sleep(2);
      
  •                         if((ret = send(new_fd, buf, strlen(buf) + 1, 0)) == -1)
      
  •                         {
      
  •                                 perror(“send : “);
      
  •                         }
      

  •   
  •                         sleep(2);
      
  •                 }
      

  •   
  •                
      

  •   
  •                 close(new_fd);
      

  •   
  •         return 0;
      
  •         }
      
  • }

复制代码
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表