Я пытаюсь добавить сервер сокетов posix в свое приложение для iOS, которое разрешит TCP-соединение и записывает буфер в объект UILabel в качестве теста.
Я могу заставить его работать... один раз. Затем он завершает и закрывает соединение. Хорошо, легко исправить, я просто поставлю это в цикл. Теперь всякий раз, когда я помещаю один и тот же код в цикл, он по какой-то причине не обновляет UILabel. На самом деле мне не нужно обновлять UILabel, это был просто тест, чтобы убедиться, что сервер работает ...... но это заставляет меня нервничать. Я вынимаю его из цикла while, он работает, я вставляю его обратно, и работает все, кроме вызова UILabel setText.
Кроме того, два других небольших вопроса: мне трудно понять, как выйти из цикла после отключения клиента, и я не уверен, как правильно закрыть порты при выходе, я должен постоянно менять номер порта, потому что это не могу связать.
-(void)viewDidLoad
NSThread *listenThread = [[NSThread alloc] initWithTarget:self selector:@selector(createPosixServer) object:nil];
[listenThread start];
-(void)создатьPosixServer
//declarations
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[256];
struct sockaddr_in serv_addr, cli_addr;
int n;
NSString *nsbuffer;
//bind and listen on socket
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sockfd < 0) {
NSLog(@"Error while calling socket()");
}
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = 1818;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
NSLog(@"ERROR on binding");
}
listen(sockfd, 5);
NSLog(@"Begin listen loop");
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
if (newsockfd < 0) {
NSLog(@"ERROR on accept");
}
while(true) {
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) {
NSLog(@"ERROR reading from socket");
}
if (n > 0) {
nsbuffer = [NSString stringWithCString:buffer encoding:NSASCIIStringEncoding];
[_lblStatus setText:nsbuffer];
NSLog(@"You sent %@", nsbuffer);
}
NSLog(@"Finished listen loop");
sleep(1);
}
close(newsockfd);
close(sockfd);
NSLog(@"Socket closed");