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

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注册套接字流并异步处理流事件。