Я что-то пропустил в коде

Тема в разделе "WASM.HEAP", создана пользователем device, 7 авг 2007.

  1. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Код (Text):
    1. #include <stdio.h>
    2. #include <sys/types.h>
    3. #include <sys/socket.h>
    4. #include <netinet/in.h>
    5.  
    6. #define BUFSZ 128
    7.  
    8. main(int argc, char *argv[]) {
    9.         int s, sz, i;
    10.         struct sockaddr_in ssa;
    11.         struct sockaddr *sp;
    12.         struct in_addr sip;
    13.         char* buf[BUFSZ];
    14.  
    15.         sp=(struct sockaddr *)&ssa;
    16.         sz=sizeof(ssa);
    17.  
    18.         if(argc!=2){
    19.            
    20.                 exit(1);
    21.         }
    22.         if(inet_aton(argv[1], &sip) != 1){
    23.                
    24.                 exit(1);
    25.         }
    26.         s=socket(AF_INET, SOCK_STREAM, 0);
    27.         if(s == -1){
    28.                          exit(1);
    29.         }
    30.  
    31.         ssa.sin_family = AF_INET;
    32.         ssa.sin_port = htons(7);
    33.         ssa.sin_addr = sip;
    34.         if(connect(s, sp, sz) == -1){
    35.                 perror("Коннект рухнул");
    36.                 exit(1);
    37.         }else{
    38.  
    39.     printf (recv(s, buf, BUFSZ, 0));
    40. }
    41. }
    нужо int с echo сервера вывести, а клиент виснет....
    я что-то пропустил?
     
  2. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    попробуй сначала записать в сокет ченить.
    Клиент не виснет, просто ждет, когда прийдут данные.
     
  3. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Ation
    Пробовал... не помогает.
    Даже так пробывал:
    Код (Text):
    1.  ssa.sin_port = htons(133);
    на порте 133 у локалхоста висит ping-pong, который реагирует на сам коннект.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Эээ.. recv возвращает число байт вроде, а не указатель...
     
  5. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    у тебя recv() ждет пока 128 байт прийдет.
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Действительно, странный вызов
    printf (recv(s, buf, BUFSZ, 0));
    Видимо имелось в виду что-то вроде
    printf("%s", buf),
    если строка в buf заканчивается 0.
     
  7. Ation

    Ation New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2005
    Сообщения:
    92
    Адрес:
    Zaporozhie
    Нет. Ожидание заполнения всего буфера происходит только при установке флага MSG_WAITALL.
    device
    а под какую ось хоть клиент?
     
  8. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Ation
    ага, что-то у меня затмение :derisive:
     
  9. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Но в данном случае, все зависает скорее всего именно из-за ожидания дополнительных данных со стороны сервера, если протокол общения с сервером нам здесь поведан верный.
    Такое возможно, если после отправки TCP данных сервером, которые клиент уже в состоянии будет обработать, серверный TCP/IP стек не завершает посылку PSH(push) флагом, который обычно выставляется в последнем пакете с пейлоадом(иными словами, с последней порцией данных, отправляемых единичным вызовом send()) и при этом не рвет TCP соединение. Таким образом TCP/IP стек клиента может не вернуть управление из recv() и ждать в текущем соединении одного из следующих событий:
    либо заполнения всего предоставленного буфера, если ни одно из вышеперечисленного не произошло.
    Тоесть вывод:
    если точно известно, что
    то сразу после коннекта к серверу, без посылки ему каких-либо данных, нужно _получать_ именно 4 байта, а не 128. И есс-но, проверять возвращаемое recv значение - если пришло меньше 4-ех, пробуем получить еще остаток.
     
  10. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    А вообще, если исходить из названия сервера, то echo-сервер должен посылает какой-либо ответ, только после получения запроса от клиента.
    Можно послать 1 байт и попробовать получить также 1 байт, и посмотреть на результат.
     
  11. device

    device Reflection

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    1.198
    Адрес:
    RF
    Разобрался.
     
  12. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Из ответа чувствуется, почему не строился диалог с сервером.