Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

nonblocking sockets C (си)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> nonblocking sockets C (си)
Имя
Сообщение << Старые топики   Новые топики >>
nonblocking sockets C (си) - 2010-02-07 20:08:32.813333   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
доброго времени суток, уважаемые.
писал программку на Си - что то отдалённо напоминающее хттп клиент
отправляет гет запрос и ждет ответа сервера.
использует сокеты.
доп зависимости в линкере wsock32.lib Ws2_32.lib
#include &lt;stdio.h&gt; /* for printf(), fprintf() */ #include &lt;winsock.h&gt; /* for socket(),... */ #include &lt;stdlib.h&gt; /* for exit() */ #define RCVBUFSIZE 32 /* Size of receive buffer */ void DieWithError(char *errorMessage){ perror(errorMessage); exit(0); }; /* Error handling function */ void main(int argc, char *argv[]) { int sock; /* Socket descriptor */ struct sockaddr_in echoServAddr; /* Echo server address */ unsigned short echoServPort; /* Echo server port */ char *servIP; /* Server IP address (dotted quad) */ char echoString[]= "GET http://127.0.0.1:8088/?identifier=1z2y3z HTTP/1.0\r\n\r\n"; char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */ int echoStringLen; /* Length of string to echo */ int bytesRcvd, totalBytesRcvd; /* Bytes read in single recv() and total bytes read */ WSADATA wsaData; /* Structure for WinSock setup communication */ unsigned long nonblocking = 1; if ((argc &lt; 2) || (argc &gt; 3)) /* Test for correct number of arguments */ { fprintf(stderr, "Usage: %s &lt;Server IP&gt; &lt;Echo Port&gt;\n", argv[0]); exit(1); } servIP = argv[1]; /* First arg: server IP address (dotted quad) */ echoServPort = argv[2]; /* Second arg: server port */ if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */ { fprintf(stderr, "WSAStartup() failed"); exit(1); } /* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) &lt; 0) DieWithError("socket() failed"); /* Set the socket to nonblocking */ if (ioctlsocket(sock, FIONBIO, &nonblocking) != 0) DieWithError("ioctlsocket() failed"); /* Construct the server address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */ /* Establish the connection to the echo server */ if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) &lt; 0) DieWithError("connect() failed"); echoStringLen = strlen(echoString); /* Determine input length */ /* Send the string, including the null terminator, to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected"); /* Receive the same string back from the server */ totalBytesRcvd = 0; printf("Received: "); /* Setup to print the echoed string */ while (totalBytesRcvd &lt; echoStringLen) { /* Receive up to the buffer size (minus 1 to leave space for a null terminator) bytes from the sender */ if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) &lt;= 0) DieWithError("recv() failed or connection closed prematurely"); totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */ echoBuffer[bytesRcvd] = '\0'; /* Add \0 so printf knows where to stop */ printf("%s", echoBuffer); /* Print the echo buffer */ } printf("\n"); /* Print a final linefeed */ closesocket(sock); WSACleanup(); /* Cleanup Winsock */ exit(0); } при коннекте "program.exe host port"
ошибка соединения, почему не понимаю
connect () failed: no error
прошу помощи в разъяснении
Post #: 1
RE: nonblocking sockets C (си) - 2010-02-07 20:12:47.383333   
AdReNaL1Ne

Сообщений: 8027
Оценки: 350
Присоединился: 2005-09-11 06:38:05
quote:

http://127.0.0.1:8088/?identifier=1z2y3z


Уверен, что сервер именно по этому адресу и порту крутится и корректно принимает подобный запрос?
Post #: 2
RE: nonblocking sockets C (си) - 2010-02-07 20:26:44.683333   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
да, спокойно коннектится телнетом. строка может вобще быть любая, сервер ловит всё что с "identifier="
т.е. может быть просто
char echoString[]= "identifier=1z2y3z \r\n\r\n";
Post #: 3
RE: nonblocking sockets C (си) - 2010-02-07 20:52:50.880000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
unsigned short echoServPort; /* Echo server port */ [...] echoServPort = argv[2]; /* Second arg: server port */ Тебе показана медитация над этими двумя строчками. Во второй зарыта ошибка. ;)
Кстати компилятор, я думаю, может тебе рассказать про эту ошибку, но тебе стоит включить уровень предупреждений повыше. Чтобы компилятор ругался по любому поводу.

ps. дальше не смотрел – не знаю.
Post #: 4
RE: nonblocking sockets C (си) - 2010-02-07 22:14:44.470000   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
теперь там
echoServPort = atoi(argv[2]); НО. ошибку не выдает. просто вырыбается, не выполнив подключение (сервер сказал никто не подключался)
Post #: 5
RE: nonblocking sockets C (си) - 2010-02-07 23:59:05.133333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
ыыы.
ты сделал сокет неблокирующим, это значит что connect не дожидается когда коннект будет установлен, и возвращает управление в твою программу. твоя программа тоже не делает никаких попыток дождаться коннекта, и начинает что-то отправлять.
если так важно неблокирующие сокеты, то надо использовать select для ожидания завершения предыдущей операции. глянь, скажем, здесь http://rhoden.id.au/doc/sockets2.html
там правда код *nix'овый, но это не меняет сути.
Post #: 6
RE: nonblocking sockets C (си) - 2010-02-08 02:02:35.740000   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
все примеры который я видел с select для никсов. у меня моск сейчас вообще не догоняет как это реализовать в моём клиенте 0_о
Post #: 7
RE: nonblocking sockets C (си) - 2010-02-08 02:26:44.680000   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
подправил. теперь ждет 2.5 секунды и выходит :D
Программа "[2312] у3к6.exe: Машинный код" завершилась с кодом 0 (0x0).
#include &lt;stdio.h&gt; /* for printf(), fprintf() */ #include &lt;winsock.h&gt; /* for socket(),... */ #include &lt;stdlib.h&gt; /* for exit() */ #include &lt;time.h&gt; #include &lt;sys/types.h&gt; #define RCVBUFSIZE 32 /* Size of receive buffer */ void DieWithError(char *errorMessage){ perror(errorMessage); exit(0); }; /* Error handling function */ void main(int argc, char *argv[]) { int sock, rc, read_fds, echoServPort; struct sockaddr_in echoServAddr; // unsigned short echoServPort; char *servIP; char echoString[]= "identifier=1z2y3z \r\n\r\n"; char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */ int echoStringLen; /* Length of string to echo */ int bytesRcvd, totalBytesRcvd; /* Bytes read in single recv() and total bytes read */ WSADATA wsaData; /* Structure for WinSock setup communication */ unsigned long nonblocking = 1; struct timeval tv; fd_set readfds; tv.tv_sec = 2; tv.tv_usec = 500000; servIP = argv[1]; /* First arg: server IP address (dotted quad) */ // echoServPort = atoi(argv[2]); /* Use given port, if any */ echoServPort = 8088; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */ { fprintf(stderr, "WSAStartup() failed"); exit(1); } /* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) ) &lt; 0) DieWithError("socket() failed"); /* Set the socket to nonblocking */ if (ioctlsocket(sock, FIONBIO, &nonblocking) != 0) DieWithError("ioctlsocket() failed"); /* Construct the server address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */ FD_ZERO(&readfds); FD_SET(sock, &readfds); rc = select(sock, &readfds, NULL, NULL, &tv); if((rc == 1) && (FD_ISSET(sock, &read_fds))) { /* Establish the connection to the echo server */ if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) &lt; 0) DieWithError("connect() failed"); echoStringLen = strlen(echoString); /* Determine input length */ /* Send the string, including the null terminator, to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected"); /* Receive the same string back from the server */ totalBytesRcvd = 0; printf("Received: "); /* Setup to print the echoed string */ while (totalBytesRcvd &lt; echoStringLen) { /* Receive up to the buffer size (minus 1 to leave space for a null terminator) bytes from the sender */ if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) &lt;= 0) DieWithError("recv() failed or connection closed prematurely"); totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */ echoBuffer[bytesRcvd] = '\0'; /* Add \0 so printf knows where to stop */ printf("%s", echoBuffer); /* Print the echo buffer */ } } printf("\n"); /* Print a final linefeed */ closesocket(sock); WSACleanup(); /* Cleanup Winsock */ exit(0); }
Post #: 8
RE: nonblocking sockets C (си) - 2010-02-08 09:08:43.213333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: iSlava
все примеры который я видел с select для никсов. у меня моск сейчас вообще не догоняет как это реализовать в моём клиенте 0_о

прям также как там. используй select, он в венде тоже есть.
Post #: 9
RE: nonblocking sockets C (си) - 2010-02-08 13:15:37.320000   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
так выше же написал с селектом.
сейчас ниже с writedfs
#include &lt;stdio.h&gt; /* for printf(), fprintf() */ #include &lt;winsock.h&gt; /* for socket(),... */ #include &lt;stdlib.h&gt; /* for exit() */ #include &lt;time.h&gt; #include &lt;sys/types.h&gt; #define RCVBUFSIZE 32 /* Size of receive buffer */ void DieWithError(char *errorMessage){ perror(errorMessage); exit(0); }; /* Error handling function */ void main(int argc, char *argv[]) { int sock, rc; /* Socket descriptor */ struct sockaddr_in echoServAddr; /* Echo server address */ unsigned short echoServPort; /* Echo server port */ char *servIP; /* Server IP address (dotted quad) */ char echoString[]= "identifier=1z2y3z \r\n\r\n"; char echoBuffer[RCVBUFSIZE]; /* Buffer for echo string */ int echoStringLen; /* Length of string to echo */ int bytesRcvd, totalBytesRcvd; /* Bytes read in single recv() and total bytes read */ WSADATA wsaData; /* Structure for WinSock setup communication */ unsigned long nonblocking = 1; fd_set writefds; struct timeval tv; tv.tv_sec = 2; tv.tv_usec = 500000; servIP = argv[1]; /* First arg: server IP address (dotted quad) */ echoServPort = atoi(argv[2]); /* Use given port, if any */ if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) /* Load Winsock 2.0 DLL */ { fprintf(stderr, "WSAStartup() failed"); exit(1); } /* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) ) &lt; 0) DieWithError("socket() failed"); /* Set the socket to nonblocking */ if (ioctlsocket(sock, FIONBIO, &nonblocking) != 0) DieWithError("ioctlsocket() failed"); /* Construct the server address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */ FD_ZERO(&writefds); FD_SET(sock, &writefds); rc = select(sock, NULL, &writefds, NULL, &tv); if((rc == 1) && (FD_ISSET(sock, &writefds))) { /* Establish the connection to the echo server */ if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) &lt; 0) DieWithError("connect() failed"); echoStringLen = strlen(echoString); /* Determine input length */ /* Send the string, including the null terminator, to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected"); /* Receive the same string back from the server */ totalBytesRcvd = 0; printf("Received: "); /* Setup to print the echoed string */ while (totalBytesRcvd &lt; echoStringLen) { /* Receive up to the buffer size (minus 1 to leave space for a null terminator) bytes from the sender */ if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) &lt;= 0) DieWithError("recv() failed or connection closed prematurely"); totalBytesRcvd += bytesRcvd; /* Keep tally of total bytes */ echoBuffer[bytesRcvd] = '\0'; /* Add \0 so printf knows where to stop */ printf("%s", echoBuffer); /* Print the echo buffer */ } } printf("\n"); /* Print a final linefeed */ closesocket(sock); WSACleanup(); /* Cleanup Winsock */ exit(0); }
Post #: 10
RE: nonblocking sockets C (си) - 2010-02-08 14:13:06.383333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
После любой операции с сокетом должен идти select.
connect
select
write
select
read
select
и тп.
select, в данной ситуации позволяет дождаться, когда будет закончено выполнение предыдущей операции. Пока коннект с сервером не установлен, ни о какой отправке данных речи быть не может, поэтому ждём:select (sock, NULL, &writefds, NULL, &tv); потом говорим write, и хотим прочитать ответ. Но пока ответ не пришёл, читать бессмысленно. Поэтому select (sock, &readfds, NULL, NULL, &tv); и только потом read.
Можно обойтись без select, но тогда сокеты должны быть блокирующими, тогда каждый read/write/connect будет останавливать (блокировать) выполнение программы до тех пор, пока не будет завершена операция.

Кстати как-то странно написано… ведь connect на неблокирующем сокете может вернуть -1 (ошибку), и в errno положить EINPROGRESS, что собственно и должно означать, что надо дождаться когда коннект будет установлен. Или я чего-то не так понимаю?
Post #: 11
RE: nonblocking sockets C (си) - 2010-02-08 16:42:45.986666   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
quote:

Пока коннект с сервером не установлен, ни о какой отправке данных речи быть не может, поэтому

да, про порядок выполнения всего этого дела правильно пишешь, спасибо.
т.е. даже реализовав то что ты написал выше не происходит никакого подключения, не говоря уже о отправке/приеме чего либо
select возвращает 0, что говорит о истекшем тайм ауте
а значения sin_port, echoServAddr.sin_port разве должны быть такими?
">
Post #: 12
RE: nonblocking sockets C (си) - 2010-02-08 20:21:06.423333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: iSlava
а значения sin_port, echoServAddr.sin_port разве должны быть такими?

Я думаю да. Это просто потому, что htons порядок байт меняет с big-endian нормального для x86, на little-endian.

В последнем листинге, у тебя первый селект перед connect'ом. Это по-моему не совсем правильно. ;)
Post #: 13
RE: nonblocking sockets C (си) - 2010-02-08 21:20:22.060000   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
так коннектится(вижу в логах серва), но сразу же выдает connect() failed: no error
/* Establish the connection to the echo server */ if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) &lt; 0) DieWithError("connect() failed"); короче степ овер показал что коннект < 0 и дохнет :D
как ты и говорил.
quote:

Кстати как-то странно написано… ведь connect на неблокирующем сокете может вернуть -1 (ошибку), и в errno положить EINPROGRESS, что собственно и должно означать, что надо дождаться когда коннект будет установлен. Или я чего-то не так понимаю?

А вот так я сделал
/* Establish the connection to the echo server */ if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) &lt; 0) {rc = select(sock, NULL, &writefds, NULL, &tv); if((rc == 1) && (FD_ISSET(sock, &writefds))) { /* Send the string, including the null terminator, to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected"); } } else DieWithError("connect() failed");
Post #: 14
RE: nonblocking sockets C (си) - 2010-02-09 00:03:27.450000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
На самом деле, я бы сделал иначе. Я бы отключил O_NONBLOCK после connect. А потом бы использовал функции read/write. Я не знаю как там send себя ведёт, но read/write гарантирует то, что если select сказал что сокет готов к записи, то write не заблокирует выполнение, хотя может отправить меньше чем мы просим. То же самое с read, если select сказал, что сокет готов к чтению, то read не заблокирует программу, но может прочитать меньше, чем мы просим.
Короче, ниже код. Рабочий. Правда его слегка придётся подправить под венду. В частности воткнуть WSAStartup. Неблокируемость сокета отрубается после коннекта, но тем не менее программа блокируется только на select'ах (чего понятно дело несложно избежать если надо, задав timeout).
#include &lt;stdio.h&gt; /* for printf(), fprintf() */ #include &lt;stdlib.h&gt; /* for exit() */ #include &lt;sys/socket.h&gt; #include &lt;netinet/in.h&gt; #include &lt;fcntl.h&gt; #include &lt;unistd.h&gt; #include &lt;sys/types.h&gt; #include &lt;string.h&gt; #include &lt;errno.h&gt; #include &lt;arpa/inet.h&gt; #define RCVBUFSIZE 32 /* Size of receive buffer */ static const char server_address[] = "92.241.175.148"; static const int server_port = 80; static const char http_request[] = "GET http://forum.xakep.ru/ HTTP/1.1\r\n" "Host: forum.xakep.ru\r\n" "User-Agent: Example C HTTP Client\r\n" "Accept: text/html\r\n" "Connection: close\r\n" "\r\n"; int set_socket_nonblocking (int sock, int blocking) { #ifdef WINDOWS if (ioctlsocket(sock, FIONBIO, &nonblocking) != 0) { perror ("ioctlsocket() failed"); return -1; } #else int x; x = fcntl (sock, F_GETFL, 0); if (blocking) { x |= O_NONBLOCK; } else { x &= ~O_NONBLOCK; } if (fcntl (sock, F_SETFL, x) &lt; 0) { perror ("set_socket_nonblockinig"); return -1; } #endif return 0; } int sock_write (int sock, char *data) { int written = 0; int remaining = strlen (data); int ret; fd_set writefds, readfds; while (remaining &gt; 0) { FD_ZERO (&writefds); FD_SET (sock, &writefds); FD_ZERO (&readfds); FD_SET (sock, &readfds); fprintf (stderr, "waiting for some event...\n"); ret = select (sock+1, &readfds, &writefds, NULL, NULL); if (ret &lt; 0) { perror ("sock_write:"); return -1; } fprintf (stderr, "Something happens, lets look closier...\n"); if (FD_ISSET (sock, &readfds)) { /* в принципе http протокол гарантирует нам, что здесь мы никогда не окажемся. */ fprintf (stderr, "some data arrived, but we are not sent all the headers.\n"); } if (FD_ISSET (sock, &writefds)) { fprintf (stderr, "we can now write and do not block! Lets do it.\n"); do { ret = write (sock, data + written, remaining); } while (ret &lt; 0 && errno == EINTR); if (ret &lt; 0) { perror ("write"); return -1; } fprintf (stderr, "We wrote %d bytes\n", ret); written += ret; remaining -= ret; } } return written; } int sock_read (int sock, char **buf, size_t *size) { int readed = 0; fd_set writefds, readfds; int ret; while (1) { /* следующие две строчки я закомментировал, ибо скорее всего, * мы на каждом вызове select будем тут же получать ответ, что * socket доступен для записи. Но запись нас не интересует. */ /* FD_ZERO (&writefds); FD_SET (sock, &writefds); */ FD_ZERO (&readfds); FD_SET (sock, &readfds); fprintf (stderr, "waiting for some event...\n"); ret = select (sock+1, &readfds, NULL, NULL, NULL); if (ret &lt; 0) { perror ("sock_read:"); return -1; } fprintf (stderr, "Something happens, lets look closier...\n"); if (FD_ISSET (sock, &readfds)) { fprintf (stderr, "we can now read and do not block! Lets do it.\n"); /* убедимся что есть место в буфере */ if (*size &lt; readed + 1024) { fprintf (stderr, "changing size of buffer from %d to %d\n", (int)*size, (int)(*size+1024)); *buf = realloc (*buf, (*size) += 1024); } if (!*buf) { fprintf (stderr, "что-то с памятью моей стало...\n"); exit (1); } do { ret = read (sock, *buf + readed, 1024); } while (ret &lt; 0 && errno == EINTR); if (ret &lt; 0) { perror ("write"); return -1; } if (ret == 0) { fprintf (stderr, "EOF reached. Seems that server closed connection.\n"); return readed; } fprintf (stderr, "We have read %d bytes\n", ret); readed += ret; } } } int nonblock_connect (char *address, int port) { int sock; struct sockaddr_in echoServAddr; /* Echo server address */ /* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) &lt; 0) { perror (""); } memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(address); /* Server IP address */ echoServAddr.sin_port = htons(port); /* Server port */ if (set_socket_nonblocking (sock, 1) &lt; 0) return -1; /* Construct the server address structure */ /* Establish the connection to the echo server */ if (connect (sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) &lt; 0) if (errno != EINPROGRESS) { perror (""); return -1; } return sock; } int main(int argc, char *argv[]) { int sock; /* Socket desсriрtor */ char *buf = NULL; size_t buf_size = 0; size_t readed; fd_set writefds, readfds; int ret; if ((sock = nonblock_connect (server_address, server_port)) &lt; 0) { perror (""); return 1; } /* вероятно ждать не надо, но мы подождём, чё сложно чтоль :) */ FD_ZERO (&writefds); FD_SET (sock, &writefds); FD_ZERO (&readfds); FD_SET (sock, &readfds); fprintf (stderr, "waiting for connect...\n"); ret = select (sock+1, NULL, &writefds, NULL, NULL); if (ret != 1 || !FD_ISSET (sock, &writefds)) { perror ("connect failed"); return 1; } fprintf (stderr, "Ok. connected.\n"); if (set_socket_nonblocking (sock, 0) &lt; 0) return 1; if (sock_write (sock, http_request) &lt; 0) return 1; readed = sock_read (sock, &buf, &buf_size); if (readed &lt; 0) { return 1; } write (STDOUT_FILENO, buf, readed); free (buf); close (sock); return 0; }
Post #: 15
RE: nonblocking sockets C (си) - 2010-02-09 18:24:51.186666   
iSlava

Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
всё, проблемы решены
Post #: 16
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> nonblocking sockets C (си)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.