You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UDP数据传输程序故障排查求助

UDP数据传输程序故障排查求助

我写了一个UDP客户端和服务器程序,逻辑是客户端发送一条标准LS命令给服务器,同时指定命令的执行次数;服务器执行对应次数的命令后,把输出结果以64字节为单位分批传输回客户端,客户端接收后打印内容。但实际运行下来程序并没有按预期工作,我检查了半天也没找到问题所在,麻烦各位帮忙看看!下面是客户端和服务器的代码:

客户端代码

#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

typedef struct sockaddr_in sock;
typedef struct sockaddr sck;

int main()
{
    char cmd[10],rcv[65];
    int tm,end,ack = 1;

    printf("Enter any standard LS command: ");
    scanf("%s",cmd);
    printf("Enter no.of times to be executed: ");
    scanf("%d",&tm);

    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    sock addr;
    int len = sizeof(addr);

    addr.sin_family = AF_INET;
    addr.sin_port = htons(5000);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    sendto(sockfd,cmd,sizeof(cmd),0,(sck *)&addr,len);
    sendto(sockfd,&tm,sizeof(int),0,(sck *)&addr,len);

    while(end)
    {
        int sz = recvfrom(sockfd,rcv,sizeof(rcv),0,(sck *)&addr,&len);
        printf("%s\n",rcv);

        if(sz == 64)
            sendto(sockfd,&ack,sizeof(int),0,(sck *)&addr,len);
        else
        {
            ack = 0;
            sendto(sockfd,&ack,sizeof(int),0,(sck *)&addr,len);
        }

        recvfrom(sockfd,&end,sizeof(int),0,(sck *)&addr,&len);
    }

    close(sockfd);
}

服务器代码

#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

typedef struct sockaddr_in sock;
typedef struct sockaddr sck;

int main()
{
    char cmd[10],snd[65],ch;
    int tm,cn = 0,end = 1, ack;

    int sockfd = socket(AF_INET,SOCK_DGRAM,0);
    sock addr;
    int len = sizeof(addr);

    addr.sin_family = AF_INET;
    addr.sin_port = htons(5000);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");

    bind(sockfd,(sck *)&addr,sizeof(addr));

    recvfrom(sockfd,cmd,sizeof(cmd),0,(sck *)&addr,&len);
    recvfrom(sockfd,&tm,sizeof(int),0,(sck *)&addr,&len);

    int fd = open("op.txt",O_CREAT | O_WRONLY | O_TRUNC,0644);
    int bc = dup(1);
    dup2(fd,1);

    for(int i = 1;i <= tm;i++)
        system(cmd);

    close(fd);
    dup2(bc,1);

    fd = open("op.txt",O_RDONLY);

    while(read(fd,&ch,1))
    {
        if(cn < 64)
            snd[cn] = ch;
        else
        {
            snd[cn] = '\0';
            sendto(sockfd,snd,sizeof(snd),0,(sck *)&addr,len);
            recvfrom(sockfd,&ack,sizeof(ack),0,(sck *)&addr,&len);
            if(!ack)
            {
                end = 0;
                sendto(sockfd,&end,sizeof(int),0,(sck *)&addr,len);
                break;
            }
            else
                sendto(sockfd,&end,sizeof(int),0,(sck *)&addr,&len);
            cn = 0;
        }
        cn++;
    }

    close(fd);
    close(sockfd);
}

备注:内容来源于stack exchange,提问作者user23427207

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 02:54:39