2016-08-18 382 views
0

在准备第一次编码UDP时,我尝试了一些示例客户端和服务器代码,并且从here进行了轻微修改。除了recvfrom()返回的值始终是缓冲区的大小而不是读取的字节数(如果我更改缓冲区大小并重新编译,收到的报告字节更改为匹配新缓冲区大小发送的字节在每次测试中都是相同的10个字节)。recvfrom()返回缓冲区的大小,而不是读取的字节数

有没有人在这段代码中看到任何错误来解释这个问题(为简明起见,在这里删除了一些错误检查)?如果它是相关的,我编译和在MacBook Pro上运行约塞米蒂10.10.5在bash运行在终端窗口:

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

#define BUFLEN 1024 
#define PORT 9930 

int main(void) { 
    struct sockaddr_in si_me, si_other; 
    int s, i, slen=sizeof(si_other); 
    int nrecv; 
    char buf[BUFLEN]; 

    s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

    memset((char *) &si_me, 0, sizeof(si_me)); 
    si_me.sin_family = AF_INET; 
    si_me.sin_port = htons(PORT); 
    si_me.sin_addr.s_addr = htonl(INADDR_ANY); 
    bind(s, &si_me, sizeof(si_me)); 

    while (1) { 
    nrecv = recvfrom(s, buf, BUFLEN, 0, &si_other, &slen); 
    printf("Received packet from %s:%d\n%d bytes rec'd\n\n", 
      inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port), nrecv); 
    } 
} 

回答

1

recvfrom截断数据报给你的缓冲区的大小时,缓冲区不够大。

recvfrom返回缓冲区大小意味着您的缓冲区大小不够大,请尝试将其增加到65535字节 - 最大理论UDP数据报大小。

+0

啊!我忽略了仔细检查客户端代码b/c我的目标实际上只是让一个简单的工作服务器来处理来自我正在工作的Android设备的数据。我使用的客户端示例发送了它的整个缓冲区,而不是我错误地假设的短消息字符串。这个错误的假设以及我只测试了等于或小于客户端缓冲区的服务器缓冲区大小的事实,导致我得出关于问题出在哪里的错误结论......最常见的情况是,问题出在我的耳朵之间! ;) 谢谢你的帮助! – GISmatters

相关问题