Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как правильно закрыть сокет, возвращенный функцией accept ?

1.0K
02 февраля 2006 года
diesel_den
169 / / 22.12.2005
При его закрытии получаю WSAEINVAL !!!
398
03 февраля 2006 года
Alexandoros
630 / / 21.10.2005
WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.
1.0K
05 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Alexandoros
WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.


Код:
...
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());
}
...

На экране, после прозвона прекрасно работающей прогой-клиентом, вижу следующее:
closesocket() failed with error WSAEINVAL.
Память не освобождается (должно быть освобождено около 1.5 Кб, занятых после возврата клиентского сокета функцией accept), это же происходит на последующих итерациях бесконечного цикла.
1.0K
05 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Alexandoros
WSAEINVAL !!!
Код в студию, с показом места, где ошибка.
еще shutdown заюзай, хотя и без него ошибок при закрытии не должно быть.



Если у кого-нить есть похожий, но работающий без утечек памяти код, прошу выложить его здесь, а не высылать мне по почте. Думаю он ещё кому-нить пригодиться.

398
06 февраля 2006 года
Alexandoros
630 / / 21.10.2005
Студии под рукою нету, но я на 95% уверен что "жадность фраера погубила":).

 
Код:
...

while (1) {

Info(Str("Waiting for connection...\n"));
memset(&connection, 0, sizeof(connection));
SOCKET s = accept(Listen, (struct sockaddr *)&connection, &sin_size);


....


Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.
1.0K
06 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Alexandoros
Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.


У меня щас под рукой тоже нету, но в исходнике, где этот глюк был найден, connection для Listen - это вообще локальная переменная в другой функции, где bind для Listen и вызывается. Возможно локальной её быть нельзя. А в данном примере вполне возможно вы правы. Сёдня днём проверю и скажу, что имеем.

1.0K
06 февраля 2006 года
diesel_den
169 / / 22.12.2005
Цитата:
Originally posted by Alexandoros
Зачем ты портищ адрес забинденый для ацептового сокета????? Не економь на байтах.



Вы оказались правы. Помогло.
Премного благодарю !!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог