Я пытаюсь использовать библиотеку 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 байтовый пакет.
Если кто-нибудь может пролить свет на то, почему мое приложение рушится здесь, я бы очень признателен. Я уже несколько часов стучаю головой, пытаясь понять, в чем проблема.
Спасибо!
Есть ли особая причина, почему вы используете библиотеку, которая не была изменена за 11 лет? http://sourceforge.net/projects/smallsockets/files/ – vikingosegundo
Не совсем. Это было предложено кем-то здесь, в StackOverflow. Однако я открыт для других предложений. Я просто очень новичок в разработке iOS и полный новичок в сетевом программировании. Не могли бы вы порекомендовать любые другие библиотеки, которые являются удобными для пользователя (и, желательно, обновлены и работоспособны)? Благодаря! – Skizz
Я более чем доволен [AsyncSocket] (https://github.com/robbiehanson/CocoaAsyncSocket) – vikingosegundo