查看: 4745|回复: 0

[分享] i.MX8M-EVK网络应用编程(TCP)

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32030
    最后登录
    2024-4-26
    发表于 2020-5-18 09:55:16 | 显示全部楼层 |阅读模式
    i.MX8M-EVK网络应用编程(TCP)




    一、 如何实现跨主机?
    套接字socket()编程


    二. 网络编程
    1、 网络体系结构模型
    OSI模型: 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 -> 7
    TCP/IP协议模型: 应用层 传输层、网络层、 网络接口与物理层 -> 4


    2、 数据是如何发送?
    数据经过每一个处理层,都会添加对应的头数据。数据到达目标主机后,会不断解析每一层头数据。


    三、传输层协议
    TCP协议、UDP协议


    1、 TCP协议?
    面向于有连接的传输方式,是一种可靠的方式。 -> (打电话)
    听电话人 -> 服务器端
    打电话人 -> 客户端


    2、 TCP协议工作流程
    套接字其实是一个特殊文件描述符,所以占用系统资源。
    端口号 -> 16位 0~65535 0~1023已经被系统占用,用户有效: 1024~65536
    IP地址 -> 32位


    /* Address to accept any incoming messages. */
    #define        INADDR_ANY ((unsigned long int) 0x00000000) -> /usr/include/linux/in.h


    服务器:
    在ubuntu上运行,
    1. <font size="3" face="微软雅黑">void *routine(void *arg)
    2. {
    3.         int connfd = *(int *)arg;
    4.         char buf[50];
    5.         while(1)
    6.         {
    7.                 bzero(buf,sizeof(buf));
    8.                 fgets(buf,50,stdin);
    9.                 send(connfd,buf,strlen(buf),0);
    10.                 if(strncmp(buf,"quit",4) == 0)
    11.                 {
    12.                         exit(0);
    13.                 }
    14.         }
    15. }
    16. int main(int argc,char *argv[])
    17. {
    18.          /*1.创建一个TCP协议的未连接套接字*/
    19.          int sockfd = socket(AF_INET,SOCK_STREAM,0);
    20.          /*2.绑定号码到未连接套接字上*/
    21.          struct sockaddr_in srvaddr,cliaddr;
    22.          socklen_t len = sizeof(srvaddr);

    23.          bzero(&srvaddr,len);
    24.          bzero(&cliaddr,len);
    25.          
    26.          srvaddr.sin_family = AF_INET;
    27.          srvaddr.sin_port = htons(atoi(argv[1]));
    28.          srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    29.          
    30.          bind(sockfd,(struct sockaddr *)&srvaddr,len);
    31.          /*3.设置监听套接字*/
    32.          listen(sockfd,5);
    33.          /*4.阻塞接受对方连接*/
    34.          int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);
    35.          if(connfd > 0)
    36.          {
    37.                  perror("connection fail:\n");
    38.          }
    39.          /*5.创建一个子线程,用于发送数据*/
    40.          pthread_t tid;
    41.          pthread_create(&tid,NULL,routine,(void*)&connfd);
    42.          /*6.主线程负责接受对方发送来的信息*/
    43.          char buf[50];
    44.          while(1)
    45.          {
    46.                  bzero(buf,50);
    47.                  recv(connfd,buf,sizeof(buf),0);
    48.                  printf("from client:%s",buf);
    49.                  if(strncmp(buf,"quit",4) == 0)
    50.                 {
    51.                         exit(0);
    52.                 }
    53.          }
    54.          /*7.挂断*/
    55.          close(connfd);
    56.          close(sockfd);
    57.         return 0;
    58. }
    59. </font>
    复制代码
    客户端:
    移植到开发板上运行


    1. <font size="3" face="微软雅黑">void *routine(void *arg)
    2. {
    3.         int sockfd = *(int *)arg;
    4.         char buf[50];
    5.         while(1)
    6.         {
    7.                 bzero(buf,sizeof(buf));
    8.                 recv(sockfd,buf,sizeof(buf),0);
    9.                 printf("from server:%s",buf);
    10.                 if(strncmp(buf,"quit",4) == 0)
    11.                         exit(0);
    12.    }
    13. }
    14. int main(int argc,char *argv[])
    15. {
    16.         //1. 创建一个TCP协议的未连接套接字
    17.         int sockfd = socket(AF_INET,SOCK_STREAM,0); //sockfd是未连接套接字
    18.         //2. 准备对方的IP地址,端口号
    19.         struct sockaddr_in srvaddr;
    20.         socklen_t len = sizeof(srvaddr);
    21.         bzero(&srvaddr,len);

    22.         srvaddr.sin_family = AF_INET;
    23.         srvaddr.sin_port = htons(atoi(argv[2]));
    24.         inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);
    25.         //3. 发起连接
    26.         int ret;
    27.         ret = connect(sockfd,(struct sockaddr *)&srvaddr,len);
    28.         if(ret < 0)
    29.         {
    30.                 printf("connect error!\n");
    31.         }
    32.        
    33.         //5. 创建一个子线程,用于发送数据
    34.         pthread_t tid;
    35.         pthread_create(&tid,NULL,routine,(void *)&sockfd);

    36.         //4. 畅聊
    37.         char buf[50];
    38.         while(1)
    39.         {
    40.                 bzero(buf,50);
    41.                 fgets(buf,50,stdin);
    42.                 send(sockfd,buf,strlen(buf),0);
    43.                
    44.                 if(strncmp(buf,"quit",4) == 0)
    45.                 break;
    46.                
    47.         }
    48.         //5. 挂断电话
    49.         close(sockfd);
    50.         return 0;
    51. }
    52. </font>
    复制代码
    将ubuntu和开发板的IP设置为同一个网关下,然后打开服务器,让客户端连接通信。
    1.png

    2.png


    文章出处:CSDN
    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-26 16:51 , Processed in 0.126947 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表