0

SmallSocketsライブラリを使用してTCPソケット接続を作成しようとしています。現在、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;
}

アプリは次の行でフリーズします:[data appendBytes:readBuffer length:count]; そして、同じ行に次のように表示されます。スレッド1:EXC_BAD_ACCESS(code = 1、address = 0x5d18c48b)。出力に表示されるのは、緑色の文字の(lldb)だけです。クライアントが接続するとすぐに、サーバーは4バイトのパケットをクライアントに送信します。

私のアプリがここでクラッシュする理由について誰かが光を当てることができれば、私は本当に感謝しています。私は数時間頭を叩いていて、問題が何であるかを理解しようとしています。

ありがとう!

4

1 に答える 1

0

これが正しい答えかどうかはわかりませんが、最初に行うことは、ソケットをすぐに保持することです。ソケットに問題がある場合は、例外ハンドラで解放します。

于 2012-06-04T22:48:33.083 に答える