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バイトのパケットをクライアントに送信します。
私のアプリがここでクラッシュする理由について誰かが光を当てることができれば、私は本当に感謝しています。私は数時間頭を叩いていて、問題が何であるかを理解しようとしています。
ありがとう!