...
Listen = socket(AF_INET, SOCK_STREAM, 0);
if (Listen == SOCKET_ERROR) {
Info(Str("socket() failed: ") + e(WSAGetLastError()) + "\n");
return SOCKET_ERROR; }
memset(&connection, 0, sizeof(connection));
connection.sin_family = AF_INET;
connection.sin_port = htons(80);
connection.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(Listen,(LPSOCKADDR)&connection,sin_size)==SOCKET_ERROR) {
closesocket(Listen);
Info(Str("bind() failed: ") + e(WSAGetLastError()) + "\n");
return SOCKET_ERROR; }
if (listen(Listen, 5) == SOCKET_ERROR) {
closesocket(Listen);
Info(Str("listen() failed: ") + e(WSAGetLastError()) + "\n");
return SOCKET_ERROR; }
while (1) {
Info(Str("Waiting for connection...\n"));
memset(&connection, 0, sizeof(connection));
SOCKET s = accept(Listen, (struct sockaddr *)&connection, &sin_size);
if (s == SOCKET_ERROR)
printf("SOCKET_ERROR\n");
if (shutdown(s, SD_BOTH) == SOCKET_ERROR)
printf((Str("shutdown() failed with error ") + e(WSAGetLastError()) + "\n").c_str());
if (closesocket(s) == SOCKET_ERROR)
printf((Str("closesocket() failed with error ") + e(WSAGetLastError()) + "\n").c_str());
}
...
Как правильно закрыть сокет, возвращенный функцией accept ?
При его закрытии получаю WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.
Цитата:
Originally posted by Alexandoros
WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.
WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.
Код:
На экране, после прозвона прекрасно работающей прогой-клиентом, вижу следующее:
closesocket() failed with error WSAEINVAL.
Память не освобождается (должно быть освобождено около 1.5 Кб, занятых после возврата клиентского сокета функцией accept), это же происходит на последующих итерациях бесконечного цикла.
Цитата:
Originally posted by Alexandoros
WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.
WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.
Если у кого-нить есть похожий, но работающий без утечек памяти код, прошу выложить его здесь, а не высылать мне по почте. Думаю он ещё кому-нить пригодиться.
Код:
...
while (1) {
Info(Str("Waiting for connection...\n"));
memset(&connection, 0, sizeof(connection));
SOCKET s = accept(Listen, (struct sockaddr *)&connection, &sin_size);
....
while (1) {
Info(Str("Waiting for connection...\n"));
memset(&connection, 0, sizeof(connection));
SOCKET s = accept(Listen, (struct sockaddr *)&connection, &sin_size);
....
Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.
Цитата:
Originally posted by Alexandoros
Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.
Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.
У меня щас под рукой тоже нету, но в исходнике, где этот глюк был найден, connection для Listen - это вообще локальная переменная в другой функции, где bind для Listen и вызывается. Возможно локальной её быть нельзя. А в данном примере вполне возможно вы правы. Сёдня днём проверю и скажу, что имеем.
Цитата:
Originally posted by Alexandoros
Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.
Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.
Вы оказались правы. Помогло.
Премного благодарю !!!