网络调试:

本文详细介绍了一种在Ubuntu上实现与开发板UDP通信的方法,包括客户端与服务器端的程序设计,展示了如何通过UDP协议进行数据的发送与接收。特别强调了在程序中正确设置IP地址和端口的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.运行在ubuntu上的测试程序:

define SERVER_PORT 9999

/*
电脑端的测试应用程序
用法 ./app send 不停的发送数据
./app rece 不停的接受数据
(注意先会发送一数据,然后再接收,
先发送一数据的原因是服务器收到的地址信息,保存
在结构体中,然后将对应的地址信息发送数据)
*/
注意下面的程序是 udp————SOCK_DGRAM tcp———————–SOCK_STREAM
UDP 建立socket 后,就可以直接调用sendto recvfrom 函数往对应的地址发送数据。

int main(int argc, char **argv)
{
    int iSocketClient;
    struct sockaddr_in tSocketServerAddr;
    struct sockaddr_in tSocketClientAddr;
    int iRet;
    unsigned char ucRecvBuf[1000];
    int iSendLen;
    int iRecvLen;
    int iAddrLen;

    if(argc!=2)
    {
      printf("usage   ./appxxx send  or  ./appxxx rece   \n");
      return 1;
    }
    iSocketClient = socket(AF_INET, SOCK_DGRAM, 0);  udp协议

    tSocketServerAddr.sin_family      = AF_INET;
    tSocketServerAddr.sin_port        = htons(SERVER_PORT);  /* host to net, short */
    //tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;

    if (0 == inet_aton("192.168.1.201", &tSocketServerAddr.sin_addr))  // 开发板的第2个端口的网络地址,开发板是服务器
    {
        printf("invalid server_ip\n");
        return -1;
    }


    memset(tSocketServerAddr.sin_zero, 0, 8);


        /* 发送数据 */
        iAddrLen = sizeof(struct sockaddr);

        if(strcmp(argv[1],"send")==0)
        {   
            while (1)
                {   

                iSendLen = sendto(iSocketClient, "setclient", 9, 0,
                                              (const struct sockaddr *)&tSocketServerAddr, iAddrLen);
                    /* 循环: 从网络读数据, 打印出来 */
                    iAddrLen = sizeof(struct sockaddr);
                //printf("send \n");    

            //   recvfrom(iSocketClient, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketServerAddr, &iAddrLen);
             //    printf("%s\n",ucRecvBuf);
            }

         }

        else if(strcmp(argv[1],"rece")==0)
            { 
              printf("receive \n");
              iSendLen = sendto(iSocketClient, "setclient", 9, 0,
                                              (const struct sockaddr *)&tSocketServerAddr, iAddrLen);
              while(1)
                {

                    /* 循环: 从网络读数据, 打印出来 */
                    iAddrLen = sizeof(struct sockaddr);
                //printf("send \n");    

                 recvfrom(iSocketClient, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketServerAddr, &iAddrLen);


         printf("receive arm-linux server send data,val is  %s,ip addr is %s\n",  ucRecvBuf, inet_ntoa(tSocketServerAddr.sin_addr));
                }
             }
       return 1;
    }

2.开发板的程序: 开发板做为服务器:

#define Net2SERVER_PORT 9999
 char *net2_ServerIpAddr="192.168.1.201";  // 开发板的Ip地址

 int g_iSocketServerNet2_fd;
 struct sockaddr_in g_tSocketServerNet2Addr;
 struct sockaddr_in g_tSocketClientNet2Addr;


static int Net2Init()
{
    /* socket初始化 */
    int iRet;

    g_iSocketServerNet2_fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (-1 == g_iSocketServerNet2_fd)
    {
        printf("net2 socket  error!\n");
        return -1;
    }

    g_tSocketServerNet2Addr.sin_family       = AF_INET;//IP V4 协议
    g_tSocketServerNet2Addr.sin_port         = htons(Net2SERVER_PORT);  /* host to net, short */
    //g_tSocketServerAddr.sin_addr.s_addr     = INADDR_ANY;  

    //本地服务器 ip地址
    if (0 == inet_aton(net2_ServerIpAddr, &g_tSocketServerNet2Addr.sin_addr))
    {
        printf("invalid net2 server_ip\n");
        return -1;
    }
    memset(g_tSocketServerNet2Addr.sin_zero, 0, 8);

    //将本地的ip地址与端口号绑定
    iRet = bind(g_iSocketServerNet2_fd, (const struct sockaddr *)&g_tSocketServerNet2Addr, sizeof(struct sockaddr));
    if (-1 == iRet)
    {
        printf("Net2 bind seting error!\n");
        return -1;
    }

/*
    //设置发送的客户端的信息

    g_tSocketClientNet2Addr.sin_family= AF_INET;//IP V4 协议
    g_tSocketClientNet2Addr.sin_port  = htons(Net2SERVER_PORT);
    if (0 == inet_aton("192.168.1.199", &g_tSocketClientNet2Addr.sin_addr))
    {
        printf(" 192.168.1.199 invalid net2 server_ip\n");
        return -1;
    }
    */
     return 1;

}



/*Net1Task 作为 client   */
void Net2SendTask()
{

    Net2Init();

    static char strTmpBuf[512]={"lxl is debuging net2 ,net2 server send data \n"};

    static int iAddrLen = sizeof(struct sockaddr);
    static int iSendLen;

    // 测试程序先send 再rec,所以先收到数据,得到客户端的ip地址
    //然后向客户端的IP地址发送数据
    while (1)
    {


        iSendLen = sendto(g_iSocketServerNet2_fd, strTmpBuf, sizeof(strTmpBuf), 0,
                                      (const struct sockaddr *)&g_tSocketClientNet2Addr, iAddrLen);

        sleep(5);

    }

    pthread_join(net2send_pthread_t, NULL);
    printf("Net2Send_pthread_t exit \n");
}


void Net2RecTask()
{
    sleep(5);   // 保证 net1task  调用网络初始化后再执行下面的操作

    socklen_t iAddrLen;
    int iRecvLen;
    char ucRecvBuf[1000];
    struct sockaddr_in tSocketNet2ClientAddr;


    while (1)
    {   
        printf("Net2RecTask \n");
        /* 读取客户端发来的数据 */
        iAddrLen = sizeof(struct sockaddr);
    // 收到绑定端口的数据,将 客户 端IP地址 存储在tSocketClientAddr上
        iRecvLen = recvfrom(g_iSocketServerNet2_fd, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketNet2ClientAddr, &iAddrLen);

        if (iRecvLen > 0)   
        {
            ucRecvBuf[iRecvLen] = '\0';
            printf("%s\n", ucRecvBuf);


        }   

        g_tSocketClientNet2Addr=tSocketNet2ClientAddr; // 赋值给send 函数

        printf("Send Net2 Client ipaddr is %s \n",inet_ntoa(tSocketNet2ClientAddr.sin_addr) );



    }

    pthread_join(net2rec_pthread_t, NULL);
    printf("Net2Rec Task exit \n");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值