草庐IT

ios - OS X/iOS 和 TCP : Why CFSocketSendData crashes application if called after connection is reset?

coder 2024-01-29 原文

我使用的客户端代码与此类似:

#import <CoreFoundation/CFSocket.h>
#include <sys/socket.h>
#include <netinet/in.h>

void receiveData(CFSocketRef s, 
                         CFSocketCallBackType type, 
                         CFDataRef address, 
                         const void *data, 
                         void *info)
{
    CFDataRef df = (CFDataRef) data;
    int len = CFDataGetLength(df);
    if(len <= 0) return;

    CFRange range = CFRangeMake(0,len);
    UInt8 buffer[len];
    NSLog(@"Received %d bytes from socket %d\n", 
                  len, CFSocketGetNative(s));
    CFDataGetBytes(df, range, buffer);
    NSLog(@"Client received: %s\n", buffer); 
    NSLog(@"As UInt8 coding: %@", df);
}

int main ()
{
    CFSocketRef s = CFSocketCreate(NULL, PF_INET, 
                                            SOCK_STREAM, IPPROTO_TCP, 
                                            kCFSocketDataCallBack, 
                                            receiveData, 
                                            NULL);
    struct sockaddr_in      sin; 
    struct hostent           *host;

    host = gethostbyname("********");      
    memset(&sin, 0, sizeof(sin));
    memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 
    sin.sin_family = AF_INET;
    sin.sin_port = htons(888);

    CFDataRef address, data;
    UInt8 message[] = "Hello world";
    CFRunLoopSourceRef source;

    address = CFDataCreate(NULL, (UInt8 *)&sin, sizeof(sin));
    data = CFDataCreate(NULL, message, sizeof(message));

    CFSocketConnectToAddress(s, address, 0);
    CFSocketSendData(s, NULL, data, 0);

    CFRelease(address);
    CFRelease(data);

    source = CFSocketCreateRunLoopSource(NULL, s, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), 
                       source, 
                       kCFRunLoopDefaultMode);
    CFRelease(source);
    CFRelease(s);
    CFRunLoopRun(); 
}

它发送数据并正确得到响应。但是 TCP 不应该只是发送数据,它应该可靠地发送数据。

我测试了这样的时间顺序:

  1. 客户端调用CFSocketConnectToAddress
  2. 服务器授权客户端
  3. 但现在服务器应用程序进程崩溃,并且服务器 -> 客户端发送 RST 标志。
  4. 然后,客户端调用 CFSocketSendData

我期望 CFSocketSendData 返回错误或至少抛出异常,但它导致应用程序崩溃,@try-catch 无效。

最佳答案

您可以尝试在第二个参数中使用显式地址吗?之后看看你是否收到错误。

CFSocketSendData(s, , data, 0);

关于ios - OS X/iOS 和 TCP : Why CFSocketSendData crashes application if called after connection is reset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710419/

有关ios - OS X/iOS 和 TCP : Why CFSocketSendData crashes application if called after connection is reset?的更多相关文章

随机推荐