Проблемы с сокетом между iOS и .NET? - PullRequest
0 голосов
/ 15 марта 2012

У меня есть настольная программа .NET, работающая как сервер, и я пытаюсь реализовать порт моей клиентской программы в iOS, но я получаю странное поведение от NSSocket.Вот соответствующий код с сервера.

public NetworkListener()
{
    _Stream = new MemoryStream();
    _tcpServer = new TcpListener(System.Net.IPAddress.Any, 8086);
    _endPoints = new List<EndPoint>();
}

public void BeginListening()
{
    _tcpServer.Start();
    _workerThread = new Thread(new ThreadStart(WorkerLoop));
    _workerThread.IsBackground = true;
    _workerThread.Start();
}

private void WorkerLoop()
{
    while(true)
    {
        _clientSocket = _tcpServer.AcceptSocket();
        _networkStream = new NetworkStream(_clientSocket, true);
        /* ... rest of method here ... */
    }
}

Я пытаюсь выполнить следующий код в iOSSimulator, используя XCode 4.2 и ориентируясь на iOS 5. Mac, на котором размещен симулятор, находится в той же сети, что и серверная программа, и я могу запустить клиент Java, которыйдля подключения просто используется тот же локальный IP-адрес, который указан ниже.В коде Objective C я получаю некоторые данные и сохраняю их в свойстве члена NSData, затем, как только Socket открывается, я использую обратный вызов потока, чтобы сообщить мне, когда попытаться отправить данные.

- (IBAction)connectToServer  
{
    NSURL *serverUrl = [NSURL URLWithString:@"10.0.0.5"];

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[serverUrl host], 8086, &readStream, &writeStream);

    [self setInStream:(NSInputStream *)readStream];
    [self setOutStream:(NSOutputStream *)writeStream];
    [self.inStream setDelegate:self];
    [self.outStream setDelegate:self];
    [self.inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [self.inStream open];
    [self.outStream open];

    NSError *error = [self.outStream streamError];
    if (error) {
        NSLog(@"outstream error: %@", [error localizedDescription]);
    }
}

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    NSError *error;
    if ([aStream isEqual:outStream]) {
        switch (eventCode) {
            case NSStreamEventHasSpaceAvailable:
                NSLog(@"Stream has space!");
                [self writeDataToStream];
                break;
            case NSStreamEventOpenCompleted:
                NSLog(@"Stream is open!");
                break;
            case NSStreamEventErrorOccurred:
                error = [self.outStream streamError];
                NSLog(@"Stream error occured: %@", [error localizedDescription]);
                break;
            default:
                break;
        }
    }
}

- (void)writeDataToStream
{
    unsigned int byteIndex = 0;
    unsigned int length = data.length;
    uint8_t *buffer = (uint8_t *)[data bytes];

    while (byteIndex <= length) {    
        unsigned int bufferLength = (length - byteIndex >= 1024) ? 1024 : (length - byteIndex);
        uint8_t tempBuffer[bufferLength];

        (void)memcpy(tempBuffer, buffer, bufferLength);
        if (self.outStream.hasSpaceAvailable) {
            bufferLength = [self.outStream write:tempBuffer maxLength:bufferLength];
            byteIndex += bufferLength;
        } else
            NSLog(@"Stream is blocked!");
    }
}

В консоли XCode я вижу «Поток открыт!», Затем «Поток имеет место!», За которым следует исключение «Операция не может быть завершена. Неверный дескриптор файла».Я поместил точку останова в код моего сервера сразу после _tcpServer.AcceptSocket(), но она никогда не срабатывает.Кажется, поток открывается, но сокет никогда не подключается?

1 Ответ

0 голосов
/ 04 июня 2012

Попробуйте проверить [hostUrl host], если это ноль.

Я также столкнулся с этой проблемой, поэтому я добавил строку протокола http:// перед IP-адресом (URLWithString:@"http://10.0.0.5").

...