iOS中的TCP Socket编程 服务器客户端响应

我几乎完成了这个任务,但我卡住了一个点,由于我得到部分结果。 我有服务器(Linux或Windows)和客户端(iOS)之间存在TCP IP套接字连接。 我已经在我的iPhone模拟器中使用表单加载服务器和iPhone之间的连接发生自动应用程序打开。 服务器将数据发送回我在模拟器上发送的数据并将其打印在日志中。 但是我不能完全接受整个回应。 对于“创新”我收到也许只是“在”或“Innova”等。下面是代码片段。

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); } } 

注意在读我没有改变数组的大小。 但是我仍然得到错误。 在IBActionbutton的情况下也是一样的。 即使在每次点击我发送数据,我没有得到相同的数据的响应。

可以宝贵的build议?

一个错误是

 int bytesRead = CFReadStreamRead(readStream, bufr,strlen((char*)bufr)); 

应该

 int bytesRead = CFReadStreamRead(readStream, bufr, sizeof(bufr)); 

CFReadStreamRead的最后一个参数是读缓冲区的容量 ,并确定读取的最大字节数。 strlen((char*)bufr)是当前在缓冲区中的string的长度 。 在打印之前,您还应该在bufr终止该string。

有了这个修改,你的程序可能会使用短string。 但是,只要您尝试发送/接收大量数据,就会出现问题。

套接字写入可以写入比您所要求的更less的字节,并且套接字读取可以返回比您请求的更less的字节。

看看Stream Programming Guide ,它描述了如何用runloop注册套接字stream,并asynchronous处理stream事件。