nonblocking sockets C (си)
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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 <stdio.h> /* for printf(), fprintf() */
#include <winsock.h> /* for socket(),... */
#include <stdlib.h> /* 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 < 2) || (argc > 3)) /* Test for correct number of arguments */
{
fprintf(stderr, "Usage: %s <Server IP> <Echo Port>\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)) < 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)) < 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 < 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)) <= 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 прошу помощи в разъяснении
|
|
|
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 Уверен, что сервер именно по этому адресу и порту крутится и корректно принимает подобный запрос?
|
|
|
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";
|
|
|
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. дальше не смотрел – не знаю.
|
|
|
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]); НО. ошибку не выдает. просто вырыбается, не выполнив подключение (сервер сказал никто не подключался)
|
|
|
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'овый, но это не меняет сути.
|
|
|
RE: nonblocking sockets C (си) - 2010-02-08 02:02:35.740000
|
|
|
iSlava
Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
|
все примеры который я видел с select для никсов. у меня моск сейчас вообще не догоняет как это реализовать в моём клиенте 0_о
|
|
|
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 <stdio.h> /* for printf(), fprintf() */
#include <winsock.h> /* for socket(),... */
#include <stdlib.h> /* for exit() */
#include <time.h>
#include <sys/types.h>
#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) ) < 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)) < 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 < 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)) <= 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);
}
|
|
|
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, он в венде тоже есть.
|
|
|
RE: nonblocking sockets C (си) - 2010-02-08 13:15:37.320000
|
|
|
iSlava
Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
|
так выше же написал с селектом. сейчас ниже с writedfs #include <stdio.h> /* for printf(), fprintf() */
#include <winsock.h> /* for socket(),... */
#include <stdlib.h> /* for exit() */
#include <time.h>
#include <sys/types.h>
#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) ) < 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)) < 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 < 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)) <= 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);
}
|
|
|
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, что собственно и должно означать, что надо дождаться когда коннект будет установлен. Или я чего-то не так понимаю?
|
|
|
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'ом. Это по-моему не совсем правильно. ;)
|
|
|
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)) < 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)) < 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");
|
|
|
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 <stdio.h> /* for printf(), fprintf() */
#include <stdlib.h> /* for exit() */
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#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) < 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 > 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 < 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 < 0 && errno == EINTR);
if (ret < 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 < 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 < 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 < 0 && errno == EINTR);
if (ret < 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)) < 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) < 0)
return -1;
/* Construct the server address structure */
/* Establish the connection to the echo server */
if (connect (sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 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)) < 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) < 0)
return 1;
if (sock_write (sock, http_request) < 0)
return 1;
readed = sock_read (sock, &buf, &buf_size);
if (readed < 0) {
return 1;
}
write (STDOUT_FILENO, buf, readed);
free (buf);
close (sock);
return 0;
}
|
|
|
RE: nonblocking sockets C (си) - 2010-02-09 18:24:51.186666
|
|
|
iSlava
Сообщений: 14
Оценки: 0
Присоединился: 2009-07-20 12:44:30.450000
|
всё, проблемы решены
|
|
|
|
|