2012-04-28 3 views
0

Как настроить мою процедуру сокетов для «отправки» (сначала) или (переключения) на «получение», если данные «являются», отправлено "с другого компьютера (сначала)?Как настроить сокеты для «send/receive» или «receive/send»

благодаря

общий код:

-(void) TcpClient{ 
    char buffer[128]; 
    struct sockaddr_in sin; 
    struct hostent *host; 
    int s; 

    host = gethostbyname("10.0.0.3"); 

    memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 
    sin.sin_family = host->h_addrtype; 
    sin.sin_port = htons(4000); 

    s = socket(AF_INET, SOCK_STREAM, 0); 
    connect(s, (struct sockaddr*)&sin, sizeof(sin)); 

    while(1){//this is the Client sequence: 
     send(s, buffer, strlen(buffer), 0);//but what if the Server sends first ?? Client needs to receive here first 
     recv(s, buffer, sizeof(buffer), 0); 
    } 
    close(s); 
} 

ответ

2

Сокет двунаправленный. Его можно читать и записывать в любое время. Если вы хотите написать единую подпрограмму, которая решает, когда читать и когда писать, вам необходимо использовать функцию select(). Он расскажет вам, когда сокет имеет данные, доступные для чтения, и когда сокет может принимать данные для отправки. Если сокет принимает данные перед отправкой данных, ваша программа может обнаружить это и выполнить операцию «получать/отправлять». Если у вас есть данные для отправки до того, как сокет получает данные, ваша программа может обнаружить это и выполнить операцию «отправить/получить». Например:

while (1) 
{ 
    fd_set fd; 
    FD_ZERO(&fd); 
    FD_SET(s, &fd); 

    timeval tv; 
    tv.tv_sec = 0; 
    tv.tv_usec = 0; 

    int ret; 

    if (select(s+1, &fd, NULL, NULL, &tv) > 0) 
    { 
     ret = recv(s, buffer, sizeof(buffer), 0); 
     if (ret > 0) 
      send(s, buffer, ret, 0); 
    } 
    else 
    { 
     ret = send(s, buffer, strlen(buffer), 0); 
     if (ret > 0) 
      recv(s, buffer, ret, 0); 
    } 
} 
+0

Разблокировка должна быть установлена? – jdl

+0

Нет, 'select()' работает как с блокирующими, так и неблокирующими сокетами. –

1

Вы можете использовать select() системный вызов, чтобы иметь дело с несколькими гнездами и запускать действия, когда данные доступны для чтения или записи. В Интернете полно информации о программировании сокетов в целом, возможно, начнется here, который содержит некоторые ссылки на другую полезную информацию.

Также this one.

И у любой книги по сетевому программированию также должны быть хорошие примеры.

Смежные вопросы