Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
jan
Зарегистрирован: 19.05.2004 Сообщения: 4
|
Добавлено: Чт Май 20 2004 22:36 Заголовок сообщения: Проблема с закрытием порта. |
|
|
Этим кодом я окрываю сокет, назначаю ему порт....
...........................
#include "winsock.h"
#pragma comment(lib,"Ws2_32.lib")
..................
SOCKET sServ;
sockaddr_in addr;
int err;
..................
sServ = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family=AF_INET;
addr.sin_port=htons(NumPort);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
if (bind(sServ, (LPSOCKADDR)&addr, sizeof(addr))== SOCKET_ERROR)
{
err=WSAGetLastError();
MessageBox(NULL, "Listenning Port (TCP) - Error", "KURSAVI", MB_OK);
}
else
{
listen(sServ, 1000);
MessageBox(NULL, "Listenning Port (TCP) - Listen ", "KURSAVI", MB_OK);
}
-----------------------------------------------------------------------------------------!
!однако возникла проблема, как закрыть сокет вместе с ассоциированным на него портом??? !
! !
!ГЛАВНОЕ освободить этот порт.... !
-----------------------------------------------------------------------------------------!
функция closesocket(sServ) не помогает. Все делаю типа так...
sServ = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family=AF_INET;
addr.sin_port=htons(NumPort);
addr.sin_addr.s_addr=htonl(INADDR_ANY);
if (bind(sServ, (LPSOCKADDR)&addr, sizeof(addr))== SOCKET_ERROR)
{
//может сюда что надо добавить????
//пробовал shutdown(,...), однако второй параметр какойто хитрый не поддается
//воприятию, не знаю что делать.
closesocket(sServ);
err=WSAGetLastError();
MessageBox(NULL, "Listenning Port (TCP) - is Closed now", "KURSAVI", MB_OK);
}
else
{
closesocket(sServ);
MessageBox(NULL, "Listenning Port (TCP) - was Closed later", "KURSAVI", MB_OK);
}
Помогите пожалуйста. |
|
Вернуться к началу |
|
|
Ersh
Зарегистрирован: 20.01.2004 Сообщения: 107
|
Добавлено: Пт Май 21 2004 09:28 Заголовок сообщения: |
|
|
CloseHandle _________________ Анархия - мать порядка!!!!!!!!! |
|
Вернуться к началу |
|
|
jan
Зарегистрирован: 19.05.2004 Сообщения: 4
|
Добавлено: Пт Май 21 2004 19:46 Заголовок сообщения: |
|
|
Не работает shutdown.
Вот поробовал вычитав с мсдэнки, однако не идет.(закрытие сокета и освобождение порта под него)
//зактрываю сокет и освобождаю занятое под него.
if (bind(sServ, (LPSOCKADDR)&addr, sizeof(addr))== SOCKET_ERROR)
{
WSAAsyncSelect(sServ, NULL, 0,FD_CLOSE);
shutdown(sServ, SD_SEND);
//Ругается на SD_SEND вообщем пишет ошибку.
// error C2065: 'SD_BOTH' : undeclared identifier
//Error executing cl.exe.
closesocket(sServ);
err=WSAGetLastError();
MessageBox(NULL, "Listenning Port (TCP) - is Closed now", "KURSAVI", MB_OK);
return 0;
}
Помогите пожалуйста курсач горит.
Вот как это напісано в МСДН.
To assure that all data is sent and received on a connected socket before it is closed, an application should use shutdown to close connection before calling closesocket. For example, to initiate a graceful disconnect:
Call WSAAsyncSelect to register for FD_CLOSE notification.
Call shutdown with how=SD_SEND.
When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
Call closesocket.
Note The shutdown function does not block regardless of the SO_LINGER setting on the socket.
Что такое и где определяется SO_LINGER сокет? |
|
Вернуться к началу |
|
|
Кольт Гость
|
Добавлено: Сб Май 22 2004 11:54 Заголовок сообщения: |
|
|
jan писал(а): | Не работает shutdown.
Вот поробовал вычитав с мсдэнки, однако не идет.(закрытие сокета и освобождение порта под него)
//зактрываю сокет и освобождаю занятое под него.
if (bind(sServ, (LPSOCKADDR)&addr, sizeof(addr))== SOCKET_ERROR)
{
WSAAsyncSelect(sServ, NULL, 0,FD_CLOSE);
shutdown(sServ, SD_SEND);
//Ругается на SD_SEND вообщем пишет ошибку.
// error C2065: 'SD_BOTH' : undeclared identifier
//Error executing cl.exe.
closesocket(sServ);
err=WSAGetLastError();
MessageBox(NULL, "Listenning Port (TCP) - is Closed now", "KURSAVI", MB_OK);
return 0;
}
Что такое и где определяется SO_LINGER сокет? |
Вызов shutdown() здесь не нужен,т.к он применяется,чтобы закрыть уже установленное соединение,а
используемые соккетом ресурсы он не освобождает.
Здесь же установленного соединения еще нет (оно появиться только после вызова accept() ), поэтому,чтобы
освободить занятые ресурсы здесь достаточно вызова closesocket(sServ). |
|
Вернуться к началу |
|
|
|