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。
我测试这样的年表:
- 客户端调用
CFSocketConnectToAddress
- 服务器授权客户端
- 但是现在服务器应用程序崩溃,并且服务器 - >客户端发送RST标志。
- 之后,客户拨打
CFSocketSendData
。
我预计CFSocketSendData
返回错误或至少抛出异常,但它会导致应用程序崩溃,并且@ try-catch不起作用。
答
你可以尝试在第二个参数中使用显式地址吗?看看你是否在那之后得到一个错误。
CFSocketSendData(s,,data,0);
+0
我现在试过了,但没有改变。因为此参数与服务器ReSeTed套接字*之间的崩溃*无关。如果不知道答案,请不要回答。 – Rou1997
什么是崩溃? – Paulw11