0

我几乎完成了这项任务,但我陷入了困境,因为我得到了部分结果。我有服务器(linux 或 windows)和客户端(iOS),它们之间存在 TCP IP 套接字连接。我在我的 iphone 模拟器中使用了表单加载,其中服务器和 iphone 之间的连接在应用程序打开时自动发生。服务器将我在模拟器上发送的数据发回并在日志中打印。但我无法准确地收到整个回复。对于“创新”,我收到的可能只是“in”或“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);
    }
}

请注意,在阅读中我确实更改了数组大小。但我仍然得到错误。在按钮的 IBAction 的情况下也是如此。即使每次点击我都会发送数据并且我没有得到相同数据的响应。

可以提出宝贵的建议???

4

1 回答 1

1

一个错误是

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

于 2013-03-23T06:08:04.250 回答