Код (Text): #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define BUFSZ 128 main(int argc, char *argv[]) { int s, sz, i; struct sockaddr_in ssa; struct sockaddr *sp; struct in_addr sip; char* buf[BUFSZ]; sp=(struct sockaddr *)&ssa; sz=sizeof(ssa); if(argc!=2){ exit(1); } if(inet_aton(argv[1], &sip) != 1){ exit(1); } s=socket(AF_INET, SOCK_STREAM, 0); if(s == -1){ exit(1); } ssa.sin_family = AF_INET; ssa.sin_port = htons(7); ssa.sin_addr = sip; if(connect(s, sp, sz) == -1){ perror("Коннект рухнул"); exit(1); }else{ printf (recv(s, buf, BUFSZ, 0)); } } нужо int с echo сервера вывести, а клиент виснет.... я что-то пропустил?
Ation Пробовал... не помогает. Даже так пробывал: Код (Text): ssa.sin_port = htons(133); на порте 133 у локалхоста висит ping-pong, который реагирует на сам коннект.
Действительно, странный вызов printf (recv(s, buf, BUFSZ, 0)); Видимо имелось в виду что-то вроде printf("%s", buf), если строка в buf заканчивается 0.
Нет. Ожидание заполнения всего буфера происходит только при установке флага MSG_WAITALL. device а под какую ось хоть клиент?
Но в данном случае, все зависает скорее всего именно из-за ожидания дополнительных данных со стороны сервера, если протокол общения с сервером нам здесь поведан верный. Такое возможно, если после отправки TCP данных сервером, которые клиент уже в состоянии будет обработать, серверный TCP/IP стек не завершает посылку PSH(push) флагом, который обычно выставляется в последнем пакете с пейлоадом(иными словами, с последней порцией данных, отправляемых единичным вызовом send()) и при этом не рвет TCP соединение. Таким образом TCP/IP стек клиента может не вернуть управление из recv() и ждать в текущем соединении одного из следующих событий: либо заполнения всего предоставленного буфера, если ни одно из вышеперечисленного не произошло. Тоесть вывод: если точно известно, что то сразу после коннекта к серверу, без посылки ему каких-либо данных, нужно _получать_ именно 4 байта, а не 128. И есс-но, проверять возвращаемое recv значение - если пришло меньше 4-ех, пробуем получить еще остаток.
А вообще, если исходить из названия сервера, то echo-сервер должен посылает какой-либо ответ, только после получения запроса от клиента. Можно послать 1 байт и попробовать получить также 1 байт, и посмотреть на результат.