回答

收藏

[评测分享] 【更适合初学者的开发板ELF 1】11-TCP编程及测试

#板卡评测 #板卡评测 2144 人阅读 | 0 人回复 | 2023-12-05

本帖最后由 stm1024 于 2023-12-7 09:41 编辑

上次测试了UCP,自然的,TCP的测试也安排上。

1. 编程规划
本次需要分别实现一个TCP服务端的程序,以及一个TCP客户端的程序。两次程序都在ELF-1上运行,当运行服务端程序时,在Windows中运行网络调试助手,将其作为客户端程序;当运行客户端程序时,在Windows中运行网络调试助手,将其作为服务端程序。

2. 编写程序
先写个服务端程序,运行在ELF-1开发板上:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <arpa/inet.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>

  9. void dispErrInfo(const char* pretext,int errcode)
  10. {
  11.     printf("%s, errno=%d: %s\n",pretext,errcode,strerror(errcode));
  12. }

  13. char msg[256]="hello, client.";
  14. char rxbuf[256];
  15. int main()
  16. {
  17.     int sktfd,ret,newsktfd;
  18.     struct sockaddr_in saddr;
  19.     struct sockaddr_in caddr;
  20.     int caddr_size,nbytes;
  21.     sktfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

  22.     if(sktfd<0)
  23.     {
  24.         dispErrInfo("create socket failed, ",errno);
  25.         return errno;
  26.     }

  27.     printf("create socket with fd=%d.\n",sktfd);

  28.     memset(&saddr,0,sizeof(saddr));
  29.     saddr.sin_family=AF_INET;
  30.         saddr.sin_addr.s_addr=htonl(INADDR_ANY);
  31.         saddr.sin_port=htons(12345);

  32.     ret=bind(sktfd,(struct sockaddr*)(&saddr),sizeof(saddr));
  33.     if(ret<0)
  34.     {
  35.         dispErrInfo("bind failed",errno);
  36.         return errno;
  37.     }

  38.     ret=listen(sktfd,5);
  39.     if(ret<0)
  40.     {
  41.         dispErrInfo("listen failed",errno);
  42.         return errno;
  43.     }
  44.     printf("Listening...\n");

  45.     caddr_size=sizeof(caddr);
  46.     newsktfd=accept(sktfd, (struct sockaddr*)(&caddr),(socklen_t*)(&caddr_size));
  47.     if(newsktfd<0)
  48.     {
  49.         dispErrInfo("accept failed",errno);
  50.         return errno;
  51.     }
  52.     //print IP & port of connected client
  53.     //**********************************
  54.     int n=caddr.sin_addr.s_addr;
  55.     printf("Client IP:");
  56.     while(n)
  57.     {
  58.         printf("%d",n%256);
  59.         n/=256;
  60.         if(n!=0)
  61.             printf(".");
  62.     }
  63.     printf("  Port=%d\n",caddr.sin_port);
  64.     //***********************************
  65.     //send message to client
  66.     while(1)
  67.     {
  68.         memset(rxbuf,0x00,256);
  69.         nbytes=read(newsktfd,rxbuf,256);
  70.         if(nbytes>0)
  71.         {
  72.             printf("Received from Client:\t%s\n",rxbuf);
  73.             write(newsktfd, msg, sizeof(msg));
  74.             if(strcmp(rxbuf,"exit")==0)
  75.             break;
  76.         }
  77.     }
  78.     close(newsktfd);
  79.     close(sktfd);
  80.     return 0;
  81. }
复制代码
测试效果如下:


客户端程序:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <arpa/inet.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>

  9. void dispErrInfo(const char* pretext,int errcode)
  10. {
  11.     printf("%s, errno=%d: %s\n",pretext,errcode,strerror(errcode));
  12. }

  13. int main()
  14. {
  15.     int sktfd,ret,x=0;
  16.     struct sockaddr_in saddr;   
  17.     char txbuf[256];
  18.     sktfd=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
  19.     if(sktfd<0)
  20.     {
  21.         dispErrInfo("create socket failed, ",errno);
  22.         return errno;
  23.     }
  24.     printf("create socket with fd=%d.\n",sktfd);

  25.     memset(&saddr,0,sizeof(saddr));
  26.     saddr.sin_family=AF_INET;
  27.         saddr.sin_addr.s_addr=inet_addr("192.168.1.102");
  28.         saddr.sin_port=htons(12345);
  29.     ret=connect(sktfd,(struct sockaddr*)&saddr,sizeof(saddr));
  30.     if(sktfd<0)
  31.     {
  32.         dispErrInfo("connect failed, ",errno);
  33.         return errno;
  34.     }
  35.     while(1)
  36.     {
  37.         memset(txbuf,0,256);
  38.         sprintf(txbuf,"hi there %d\n",x++);
  39.         write(sktfd,txbuf,strlen(txbuf));
  40.         sleep(1);  
  41.     }
  42.     return 0;
  43. }
复制代码

在Windows主机中启动网络调试助手,以TCP服务器打开,测试效果如下:




分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

5300 积分
55 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条