【问题标题】:UDP C Server not receiving packetsUDP C 服务器没有收到数据包
【发布时间】:2011-03-18 13:42:15
【问题描述】:

我知道已经回答了相关的问题,但我没有设法解决我的问题。

我有一个简单的 UDP 客户端-服务器应用程序。客户端和服务器看起来都不错,但是服务器没有收到来自客户端的数据包,它只是无限接收网络 ID 192(或者客户端没有正确发送数据包)。

我似乎无法找出问题所在,地址和端口都可以,我没有任何防火墙,我什至为端口添加了一个例外,只是为了确定。如果我启动服务器,我可以看到它在正确的端口(netstat -a -s -p udp)上监听。你能告诉我什么是错的吗?

这是我的服务器代码:

/*.. includes */
#define PORT 8888
#define NPACK 10
#define MAXLEN 100

void signalError(char* s){
    perror(s);    
    exit(1);
}

int main()
{
struct sockaddr_in struct_srv, struct_client;
int s,i,cod, numbytes;
size_t clientSize;
int32_t nr;
int32_t sir1[MAXLEN], sir2[MAXLEN], sirComune[MAXLEN], nrEl1, nrEl2, nrComune;

//Creating the socket:
s = socket(PF_INET, SOCK_DGRAM, 0);
if(s==-1) signalError("Error while creating socket!");

memset(&struct_srv, 0, sizeof(struct_srv));
struct_srv.sin_family = AF_INET;
struct_srv.sin_addr.s_addr = htonl(INADDR_ANY);
struct_srv.sin_port = htons(PORT);  

s = bind(s, (struct sockaddr*) &struct_srv, sizeof(struct_srv));
if(s==-1) signalError("Bind error. Port is already in use!");

//receive packets:    
nrEl1 = -1;

char buf[MAXLEN];
printf("Accepting packets:\n");
//for(i=0;i<NPACK;i++) {
for(;;) {
     //Receive packets from client:
    clientSize = sizeof(struct_client);        
    numbytes = recvfrom(s, buf, MAXLEN - 1, 0,
                (struct sockaddr*) &struct_client, &clientSize);
    buf[numbytes] = '\0';

    printf("Packet is %d long.\n", numbytes);
    printf("Packet contains %s:\n", buf);       
    sleep(3);
}

close(s);
return 0;
}

还有我的客户代码:

/* includes */
#define SRV_IP "127.0.0.1"
#define NPACK 100
#define MAXLEN 100
#define PORT 8888

void signalError(char* s){
    perror(s);
    exit(1);
}

int main(void)
{
struct sockaddr_in struct_client;
int s, i, result, size_client = sizeof(struct_client);
int32_t nr, sir1[MAXLEN], sir2[MAXLEN];

s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s==-1) signalError("Erorr creating socket!");

memset((char*) &struct_client, 0, sizeof(struct_client));
struct_client.sin_family = AF_INET;
struct_client.sin_addr.s_addr = htonl(INADDR_ANY);
struct_client.sin_port = htons(PORT);
if(inet_aton(SRV_IP, &struct_client.sin_addr)==0) {
    fprintf(stderr, "inet_aton() failed\n");
    exit(1);
}

char buf[MAXLEN];
int len;
for(i=0;i<NPACK;i++) {    
    printf("Give packet %d:\n", i+1);       
    fgets(buf, sizeof(buf), stdin);
    buf[strlen(buf)-1] = '\0';
    printf("I've read %s\n", buf);
    printf("Sending packet %d\n", i+1);
    result = sendto(s, buf, sizeof(buf)+1, 0,
            (struct sockaddr*) &struct_client, size_client);
    if(result==-1) signalError("Error sending packets!");        
}

close(s);
return 0;
}

【问题讨论】:

  • 您是否尝试在应用程序之间嗅探数据包?简单的 netcat 就足够了。
  • nr 和 buf 的问题是我必须向服务器发送 2 个整数数组。我首先尝试发送数字(没有运气),然后我想看看它是否适用于字符串。但这不是问题。我还添加了乔纳森的第一个建议,但结果仍然相同。服务器只是接收垃圾。
  • 根据上面的代码,您仍然发送&amp;nr,它从未初始化。您需要设置nr 以使其发送除其中已有内容之外的任何内容,这听起来像是 ASCII 字符“192”。
  • 还是同样的问题。我在服务器上没有收到任何东西..

标签: c client udp packets


【解决方案1】:

这里有几个小点:

  1. 在您的服务器中,在每次调用recvfrom 之前设置size_client = sizeof(struct_client)。它既是输入参数又是输出参数,因此您要确保一次调用的输出不会干扰到下一次调用的输入。
  2. 确保将buf 的最后一个字节设置为'\0',以防止您的printf 读取超出边界的内存。
  3. 什么是cod?它从哪里来的?我想你是想测试numbytes
  4. 设置buf[strlen(buf) - 1] = '\0' 会删除缓冲区的最后一个字符;这就是你想要做的吗?

它不起作用的主要原因:

你从未初始化过nr,所以不知道 sendto 正在发送什么。它当然不是发送buf,我认为这是你想要的......你可能想要这个:

sendto(s, buf, sizeof(buf), ...)

【讨论】:

  • 我根据您的建议修改了我的代码,但还是一样。所有这些都是我关心的东西(比如'\0'),但现在它只是烦人,因为我无法弄清楚问题,我在一些仓促的更改后发布了代码。
【解决方案2】:

除非我错过了什么激烈的东西,否则你只是在这里发送垃圾。

nr 永远不会在发件人上初始化,除非在评论中。 buf 正在初始化,但未在任何地方使用。

您可以尝试将sendto 部分更改为:

result = sendto(s, buf, strlen(buf)+1, 0,
        (struct sockaddr*) &struct_client, size_client);

【讨论】:

    【解决方案3】:

    在您的客户端代码中,通过网络发送的nr 变量未初始化,并且可以指向它想要的任何内容。您可能想改为发送您的 buf 数组。

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2016-10-18
      • 1970-01-01
      • 2015-07-13
      • 2015-08-28
      • 2016-06-20
      • 1970-01-01
      • 2012-01-22
      • 2014-02-08
      相关资源
      最近更新 更多