0
我試圖創建一個簡單的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是寫入屏幕上的輸出,而不是輸出流。混亂的命名,我應該改變...