【问题标题】:IOS UDP recvfrom works when in Blocking but not when Non-BockingIOS UDP recvfrom 在阻塞时有效,但在非阻塞时无效
【发布时间】:2013-11-15 22:43:18
【问题描述】:

当我注释掉关闭阻塞的代码时,一切正常,但是当我将非阻塞代码留在其中时,我从未从 recvfrom 获得任何数据。 (接收到的字节始终为 0)这是注释掉阻塞语句的代码。我是 Xcode 和 IOS 的新手,但已经为 .NET 创建了 UDP 代码。

 // Create Socket
int Handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (Handle <=0){
    printf("Failed to create socket\n");
}

// Bind Socket
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons((unsigned short) 4966);
if (bind(Handle,(struct sockaddr *) &address, sizeof(struct sockaddr_in))< 0){
    printf("Failed to Bind\n");
}//end if
printf("Bind Done\n");

// Set to non Blocking
int NonBlocking = 1;
//if (fcntl(Handle, F_SETFL, O_NONBLOCK, NonBlocking) == -1){
    printf("Faile to set nonblocking\n");
//}
Boolean ContinueLoop = true;

    unsigned char Packet_Data[256];
    unsigned int Maximum_Packet_Size = sizeof(Packet_Data);

    struct sockaddr_in From_Address;
    socklen_t FromLength = sizeof(From_Address);

     while (ContinueLoop){
    int Received_Bytes = recvfrom(Handle, (char *)Packet_Data, Maximum_Packet_Size, 0, (struct sockaddr *)&From_Address, &FromLength);



    if (Received_Bytes > 0){
        ContinueLoop = false;
        printf("Got Data \n");
    } else {
        perror("Now");
        printf(".");
    }



    close(Handle);

}//wend

【问题讨论】:

  • 1.当非阻塞模式下没有数据时,recvfrom() 不返回零,它返回 -1,并将 errno 设置为 EWOULDBLOCK/EAGAIN。 2. 你的 O_NONBLOCK 代码被注释掉了,所以我不知道你怎么可能做出这个断言。 3. 如果recvfrom() 返回-1,你应该处理一个错误,而不是忽略它。可能还有其他问题。 4. 无论如何,你不应该在非阻塞模式下那样旋转,你应该使用 select()。
  • 我意识到 no 块被注释掉了,我在语句中声明了这里是带有注释掉块语句的代码。我想我会发布工作代码,如果你想要非工作代码,你只需删除它们 cmets。感谢您提供有关错误代码的信息,查找文档并不容易。从调试器我得到一个 0 而不是 -1。现在我正在采取婴儿步骤。我目前的目标只是接收数据。不要用它做任何事情。这不是最终/生产代码。
  • 当我在实际设备而不是模拟器上运行时,我得到 -1 和错误文件描述符的错误。 (但只有当我包含非阻塞语句时。如果我如上所示将它们注释掉,它会起作用)
  • 这是更改后的代码 if (Received_Bytes > 0){ ContinueLoop = false; printf("得到数据\n"); } else { perror("现在"); printf("."); }
  • recvfrom() 可以返回 0 的唯一方法是它实际上正在接收长度为 0 的数据报。与 TCP 不同,UDP 数据报可以具有大小为 0 字节的数据有效负载。一些协议,例如基于 UDP 的TIME,实际上依赖于此。

标签: ios sockets udp


【解决方案1】:

发现问题。我不小心在 while 循环中包含了 close 语句。将它移出它所属的循环,现在一切正常。阻塞和非阻塞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2013-12-10
    相关资源
    最近更新 更多