查看: 1645|回复: 0

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

[复制链接]
  • TA的每日心情
    慵懒
    前天 10:54
  • 签到天数: 186 天

    连续签到: 2 天

    [LV.7]常住居民III

    发表于 2023-12-5 23:06:16 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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. }
    复制代码
    测试效果如下:
    2023-12-07_093909.png

    客户端程序:
    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服务器打开,测试效果如下:
    2023-12-07_093534.png



    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 07:26 , Processed in 0.119950 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.