OS X/iOS&TCP:为什么CFSocketSendData在连接重置后调用时会崩溃应用程序?

问题描述:

我用类似这样的客户端代码:OS X/iOS&TCP:为什么CFSocketSendData在连接重置后调用时会崩溃应用程序?

#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不应该只是发送数据,它应该发送数据RELIABLY。

我测试这样的年表:

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

我预计CFSocketSendData返回错误或至少抛出异常,但它会导致应用程序崩溃,并且@ try-catch不起作用。

+0

什么是崩溃? – Paulw11

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

CFSocketSendData(s,,data,0);

+0

我现在试过了,但没有改变。因为此参数与服务器ReSeTed套接字*之间的崩溃*无关。如果不知道答案,请不要回答。 – Rou1997