Ios 为什么recvfrom方法的返回值是4294967295,应该是0或-1?

Ios 为什么recvfrom方法的返回值是4294967295,应该是0或-1?,ios,objective-c,networking,udp,bsd,Ios,Objective C,Networking,Udp,Bsd,我正在使用sendto/recvfrom方法在我的应用程序中发送/接收UDP数据包。现在我的接收方式如下: - (void)listenForPackets { int listeningSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); if (listeningSocket <= 0) { NSLog(@"Error: listenForPackets - socket() failed.");

我正在使用sendto/recvfrom方法在我的应用程序中发送/接收UDP数据包。现在我的接收方式如下:

- (void)listenForPackets
{
    int listeningSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (listeningSocket <= 0) {
        NSLog(@"Error: listenForPackets - socket() failed.");
        return;
    }

    // set timeout to 2 seconds
    struct timeval timeV;
    timeV.tv_sec = 2;
    timeV.tv_usec = 0;

    if (setsockopt(listeningSocket, SOL_SOCKET, SO_RCVTIMEO, &timeV, sizeof(timeV)) == -1) {
        NSLog(@"Error: listenForPackets - setsockopt failed");
        close(listeningSocket);
        return;
    }

    // bind the port
    struct sockaddr_in sockaddr;
    memset(&sockaddr, 0, sizeof(sockaddr));

    sockaddr.sin_len = sizeof(sockaddr);
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = htons(18686);
    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    int status = bind(listeningSocket, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
    if (status == -1) {
        close(listeningSocket);
        NSLog(@"Error: listenForPackets - bind() failed.");
        return;
    }

    // receive
    struct sockaddr_in receiveSockaddr;
    socklen_t receiveSockaddrLen = sizeof(receiveSockaddr);

    size_t bufSize = 9216;
    void *buf = malloc(bufSize);
    size_t result = recvfrom(listeningSocket, buf, bufSize, 0, (struct sockaddr *)&receiveSockaddr, &receiveSockaddrLen);

    NSData *data = nil;

    if (result > 0) {
        NSLog(@"reslut:%zu",result);
        if (result != bufSize) {
            buf = realloc(buf, result);
        }
        data = [NSData dataWithBytesNoCopy:buf length:result freeWhenDone:YES];

        char addrBuf[INET_ADDRSTRLEN];
        if (inet_ntop(AF_INET, &receiveSockaddr.sin_addr, addrBuf, (size_t)sizeof(addrBuf)) == NULL) {
            addrBuf[0] = '\0';
        }

        NSString *address = [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding];
        NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self didReceiveMessage:msg fromAddress:address];
        });

    } else {
        free(buf);
    }

    close(listeningSocket);
}

如果设置了超时,为什么返回值是4294967295而不是0或-1?如何解决此问题?如果您有任何建议,我们将不胜感激。

请使用ssize\u t而不是size\u t

int result = recvfrom(listeningSocket, buf, bufSize, 0, (struct sockaddr *)&receiveSockaddr, &receiveSockaddrLen);
大小为无符号类型,-1将转换为
4294967295
(uint\u t32)。 请尝试以下代码:

uint32_t i = -1 ;
NSLog(@"%u", i) ; // you get 4294967295
方法声明如下:

ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags,
         struct sockaddr *restrict address, socklen_t *restrict address_len);

感谢@MartinR的更正。

size\u t是无符号整数-因此,如果您将其赋值为-1-这就是您得到的结果


使用普通的“int”代替。

正确的类型是
ssize\u t
(“签名大小类型”)而不是
int
。正确的类型是
ssize\u t
(“签名大小类型”)而不是
int
ssize_t recvfrom(int socket, void *restrict buffer, size_t length, int flags,
         struct sockaddr *restrict address, socklen_t *restrict address_len);