2012-06-04 2 views
0

Я пытаюсь использовать библиотеку SmallSockets для создания соединения сокетов TCP. В настоящее время я использую кнопку, чтобы просто проверить мое подключение к серверу с моего iPhone. Вот как выглядит мой код:SmallSocket вызывает приложение для сбоя на iPhone

-(IBAction)btnConnect:(id)sender 
{ 
    bool loopConnection = true; 
    while(loopConnection == true) 
    { 
     Socket *socket; 
     int port = 11005; 
     NSString *host = @"199.5.83.63"; 

     socket = [Socket socket]; 

     @try 
     { 
      NSMutableData *data; 
      [socket connectToHostName:host port:port]; 
      [socket readData:data]; 
      // [socket writeString:@"Hello World!"]; 

      //** Connection was successful **// 
      [socket retain]; // Must retain if want to use out of this action block. 
     } 
     @catch (NSException* exception) 
     { 
      NSString *errMsg = [NSString stringWithFormat:@"%@",[exception reason]]; 
      NSLog(errMsg); 
      socket = nil; 
     } 
    } 
} 

Когда я нажимаю кнопку, мое приложение замерзает. Она замерзает на следующей функции (которая является частью библиотеки SmallSockets):

- (int)readData:(NSMutableData*)data 
// 
// Append any available data from the socket to the supplied buffer. 
// Returns number of bytes received. (May be 0) 
// 
{ 
    ssize_t count; 

    // data must not be null ptr 

    if (data == NULL) 
    [NSException raise:SOCKET_EX_INVALID_BUFFER 
        format:SOCKET_EX_INVALID_BUFFER]; 

    // Socket must be created and connected 

    if (socketfd == SOCKET_INVALID_DESCRIPTOR) 
     [NSException raise:SOCKET_EX_BAD_SOCKET_DESCRIPTOR 
        format:SOCKET_EX_BAD_SOCKET_DESCRIPTOR]; 

    if (!connected) 
     [NSException raise:SOCKET_EX_NOT_CONNECTED 
        format:SOCKET_EX_NOT_CONNECTED]; 

    // Request a read of as much as we can. Should return immediately if no data. 

    count = recv(socketfd, readBuffer, readBufferSize, 0); 

    if (count > 0) 
    { 
     // Got some data, append it to user's buffer 

     [data appendBytes:readBuffer length:count]; 
    } 
    else if (count == 0) 
    { 
     // Other side has disconnected, so close down our socket 

     [self close]; 
    } 
    else if (count < 0) 
    { 
     // recv() returned an error. 

     if (errno == EAGAIN) 
     { 
      // No data available to read (and socket is non-blocking) 
      count = 0; 
     } 
     else 
      [NSException raise:SOCKET_EX_RECV_FAILED 
         format:SOCKET_EX_RECV_FAILED_F, strerror(errno)]; 
    } 

    return count; 
} 

В приложение замерзает на линии: [appendBytes данные: ReadBuffer длина: число]; а затем он говорит в той же строке: Thread 1: EXC_BAD_ACCESS (код = 1, адрес = 0x5d18c48b). Все, что я вижу на выходе, - это (lldb) зелеными буквами. Как только клиент подключается, сервер отправляет клиенту 4 байтовый пакет.

Если кто-нибудь может пролить свет на то, почему мое приложение рушится здесь, я бы очень признателен. Я уже несколько часов стучаю головой, пытаясь понять, в чем проблема.

Спасибо!

+0

Есть ли особая причина, почему вы используете библиотеку, которая не была изменена за 11 лет? http://sourceforge.net/projects/smallsockets/files/ – vikingosegundo

+0

Не совсем. Это было предложено кем-то здесь, в StackOverflow. Однако я открыт для других предложений. Я просто очень новичок в разработке iOS и полный новичок в сетевом программировании. Не могли бы вы порекомендовать любые другие библиотеки, которые являются удобными для пользователя (и, желательно, обновлены и работоспособны)? Благодаря! – Skizz

+0

Я более чем доволен [AsyncSocket] (https://github.com/robbiehanson/CocoaAsyncSocket) – vikingosegundo

ответ

0

Я не знаю, является ли это правильным ответом или нет, но первое, что я хотел бы сделать, это сохранить сокет сразу. Если у вас возникла проблема с сокетом, отпустите его в обработчике исключений.

+0

Я решил просто перейти в другую библиотеку AsyncSocket, и через 10 минут я успешно установил соединение. Спасибо за помощь: D – Skizz

Смежные вопросы