Я пытаюсь создать простой IRC-клиент, просто для удовольствия, и попытаться узнать немного больше о программировании сокетов в задаче C.
Итак, я посмотрел пример кода и понятия не имею, почему я не могу отправить или получить сообщение при подключении.
Сначала я подключаюсь к серверу, используя следующий код:
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".
Отправляемые / получаемые сообщения являются просто строками, я скопировал / вставил много кода с сайта разработчиков Apple, но я думаю, что в основном понимаю, что происходит, и не могу понять, почему он не дает мне что-то !
Есть идеи или я просто не на той странице?
P.S. writeToOutput - это запись в вывод на экране, а не в выходной поток. Запутывая названия, я должен изменить это ...