2015-03-29 2 views
0

Я хочу создать TCP-сервер на iPhone. Я попытался написать этот сервер, используя Apple's developer help, но я не имел успеха. Я пытался прослушивать с CoreFoundation и с POSIX Socket API, но ни один из них не работал.Как создать TCP-сервер на iPhone?

Использование CoreFoundation я реализовал следующие:

CFSocketRef myipv4cfsock = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, 
              kCFSocketAcceptCallBack, handleConnect, NULL); 

struct sockaddr_in mySocket; 

memset(&mySocket, 0, sizeof(sin)); 
mySocket.sin_len = sizeof(sin); 
mySocket.sin_family = PF_INET; 
mySocket.sin_port = 8000; 
mySocket.sin_addr.s_addr= INADDR_ANY; 

CFSocketSetAddress(myipv4cfsock, CFDataCreate(kCFAllocatorDefault, (UInt8 *)&mySocket, sizeof(mySocket))); 

CFRunLoopSourceRef socketsource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, myipv4cfsock, 0); 

CFRunLoopAddSource(CFRunLoopGetCurrent(), socketsource, kCFRunLoopDefaultMode); 

CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 
CFStringRef remoteHost = CFSTR("localhost"); 
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)remoteHost, 8000, &readStream, &writeStream); 

NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream; 
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream; 

[inputStream setDelegate: self]; 
[outputStream setDelegate: self]; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
[inputStream open]; 
[outputStream open]; 

Использование POSIX API сокетов Я осуществил это:

int listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

struct sockaddr_in socketAddr; 
memset(&socketAddr, 0, sizeof(socketAddr)); 
socketAddr.sin_len = sizeof(sin); 
socketAddr.sin_family = AF_INET; 
socketAddr.sin_port = 8000; 
socketAddr.sin_addr.s_addr= INADDR_ANY; 

if (bind(listenSocket, (struct sockaddr *)&socketAddr, sizeof(socketAddr)) < 0) 
{ 
    NSLog(@"Error: Could not bind socket."); 
} 

listen(listenSocket, 10); 

Но тогда я не знаю, как обрабатывать события с Диспетчер Grand Central ,

Когда я пытаюсь соединиться с каким-то клиентом, я всегда получаю исключение «Соединение отказано» на стороне клиента.

Есть ли у кого-нибудь пример кода?

ответ

1

Я нашел решение, использующее API-интерфейс POSIX Socket.

int listenfd = 0; 
struct sockaddr_in serv_addr; 

listenfd = socket(AF_INET, SOCK_STREAM, 0); 
memset(&serv_addr, '0', sizeof(serv_addr)); 

serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
serv_addr.sin_port = htons(8008); 

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

_listenForConnections = true; 
listen(listenfd, 10); 

dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
    NSLog(@"Waiting for connections..."); 
    while (_listenForConnections) 
    { 
     __block int connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 
     NSLog(@"Connection accepted"); 

     char buffer[1024]; 
     bzero(buffer, 1024); 
     NSString *message = @""; 
     bool continueReading = true; 

     do 
     { 
      recv(connfd , buffer , 1024 , 0); 
      int size = strlen(buffer); 
      if ((buffer[size-1] == '}' && buffer[size-2] == '{')) 
      { 
       continueReading = false; 
       buffer[size-2] = '\0'; 
      } 
      message = [NSString stringWithFormat: @"%@%s", message, buffer]; 
     }while (continueReading); 
     NSLog(@"Got message from client"); 

     char* answer = "Hello World"; 
     write(connfd, answer, strlen(answer)); 
    } 

    NSLog(@"Stop listening."); 
    close(listenfd); 
}); 
Смежные вопросы