Objective-C的socket流“错误的文件描述符”(IPhone)
问题描述:
我试图创建一个简单的IRC客户端,纯粹是为了好玩,并尝试和学习一些关于socket编程的目标C.Objective-C的socket流“错误的文件描述符”(IPhone)
所以我查看了一些示例代码,我不知道为什么我无法在连接时发送或接收消息。
if (![urlString isEqualToString:@""]) {
NSURL* url = [NSURL URLWithString:urlString];
if(!url){
[self writeToOutput:@"Invalid Url"];
return;
}
[self writeToOutput:@"Attempting Connection\n"];
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[url host], 6667, &readStream, &writeStream);
if(!readStream || !writeStream){
[self writeToOutput:@"Connection Failed!\n"];
return;
}
_inputStream = (NSInputStream *)readStream;
_outputStream = (NSOutputStream *)writeStream;
[_inputStream setDelegate:self];
[_outputStream setDelegate:self];
[_inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[_inputStream open];
[_outputStream open];
[self writeToOutput:@"Connection Successful!\n"];
}
然后我用从流以下为读/写: 首先,我用下面的代码连接到服务器
case NSStreamEventHasBytesAvailable:
if (stream == _inputStream)
{
//read data
uint8_t buffer[1024];
int len;
while ([_inputStream hasBytesAvailable])
{
len = [_inputStream read:buffer maxLength:1024];
if (len > 0)
{
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if (output != nil)
{
[self writeToOutput:output];
}
}
}
}
break;
case NSStreamEventHasSpaceAvailable:
if (stream == _outputStream)
{
const uint8_t *rawString=(const uint8_t *)[message UTF8String];
int len;
len = [_outputStream write:rawString maxLength:[message length]];
[self writeToOutput:[NSString stringWithFormat:@"%@\n",message]];
}
}
break;
当我得到一个NSStreamEventHasBytesAvailable事件,读取任何消息(len == 0),当我写入输出流时,出现“Bad File Descriptor”错误。
发送/接收的消息只是字符串,我从苹果开发者网站复制/粘贴了很多代码,但我想我主要了解发生了什么,并且不明白为什么它不会给我什么!
任何想法或我只是在错误的网页上完全?
P.S. writeToOutput是写入屏幕上的输出,而不是输出流。混乱的命名,我应该改变...