iOS中的TCP Socket编程。服务器客户端响应
问题描述:
我几乎完成这项任务,但我卡住了一个点,由于我得到部分结果。 我有服务器(Linux或Windows)和客户端(iOS)之间存在TCP IP套接字连接。我在我的iPhone模拟器中使用了表单加载,在应用程序打开时,服务器和iphone之间的连接会自动发生。服务器将数据发送回我在模拟器上发送的数据并将其打印在日志中。但我无法准确接收整个回应。对于“创新”,我收到的可能只是“in”或“Innova”等。下面是代码片段。iOS中的TCP Socket编程。服务器客户端响应
void TCPClient()
{
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, host, port, &readStream, &writeStream);
[NSThread sleepForTimeInterval:2]; //Delay
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
if(!CFWriteStreamOpen(writeStream))
{
NSLog(@"Error Opening Socket");
}
else
{
UInt8 buf[] = "Innovations";
int bytesWritten = CFWriteStreamWrite(writeStream, buf, strlen((char*)buf));
NSLog(@"Written: %d", bytesWritten);
}
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
if(!CFReadStreamOpen(readStream))
{
NSLog(@"Error reading");
}
else
{
UInt8 bufr[15];
int bytesRead = CFReadStreamRead(readStream, bufr,strlen((char*)bufr));
NSLog(@"Read: %d", bytesRead);
NSLog(@"buffer: %s", bufr);
}
}
在阅读中注意我确实改变了数组的大小。但我仍然得到错误。在IBAction按钮的情况下也是如此。即使在我发送数据的每次点击中,我都没有得到相同数据的响应。
可以宝贵的建议?
答
一个错误是
int bytesRead = CFReadStreamRead(readStream, bufr,strlen((char*)bufr));
应该是
int bytesRead = CFReadStreamRead(readStream, bufr, sizeof(bufr));
的CFReadStreamRead
最后一个参数是读缓冲器的容量和确定读取的字节的最大数量。 strlen((char*)bufr)
是当前在缓冲区中的字符串的长度。在打印之前,您还应该将bufr
中的字符串NULL-终止。
通过此修改,您的程序可能使用短字符串。但只要您尝试发送/接收大量数据,就会出现问题。
套接字写入可以写入比您所要求的更少的字节,并且套接字读取可以返回比您请求的更少的字节。
查看Stream Programming Guide,它描述了如何使用runloop注册套接字流并异步处理流事件。