Сокет отправить функции recv - PullRequest
4 голосов
/ 16 июня 2010

Я создал сокет, используя следующие строки кода. Теперь я изменяю значение сокета, я получаю вот так

m_Socket ++;

Даже теперь функции сокета send recv выполняются успешно без SOCKET_ERROR. Я ожидаю, что это должно выдать ошибку.

Я делаю что-то не так.

struct sockaddr_in ServerSock; // Структура адреса сокета для привязки номера порта для прослушивания

char *localIP ;

SOCKET SocServer;

//To Set up the sockaddr structure
ServerSock.sin_family = AF_INET;
ServerSock.sin_addr.s_addr = INADDR_ANY;

ServerSock.sin_port = htons(pLantronics->m_wRIPortNo);

// To Create a socket for listening on wPortNumber
if(( SocServer = socket( AF_INET, SOCK_STREAM, 0 )) == INVALID_SOCKET )
{
    return FALSE;
}

//To bind the socket with wPortNumber
if(bind(SocServer,(sockaddr*)&ServerSock,sizeof(ServerSock))!=0)
{
    return FALSE;
}

// To Listen for the connection on wPortNumber
if(listen(SocServer,SOMAXCONN)!=0)
{
    return FALSE;
}

// Structure to get the IP Address of the connecting Entity
sockaddr_in insock;

int insocklen=sizeof(insock);

//To accept the Incoming connection on the wPortNumber
pLantronics->m_Socket=accept(SocServer,(struct sockaddr*)&insock,&insocklen);   

if(pLantronics->m_Socket == INVALID_SOCKET)
{
    shutdown(SocServer, 2 );
    closesocket(SocServer );
    return FALSE;
}

// To make socket non-blocking
DWORD dwNonBlocking = 1;
if(ioctlsocket( pLantronics->m_Socket, FIONBIO, &dwNonBlocking ))
{
    shutdown(pLantronics->m_Socket, 2);
    closesocket(pLantronics->m_Socket);
    return FALSE;
}


pLantronics->m_sModemName = inet_ntoa(insock.sin_addr);

Теперь я делаю

m_Socket++;//change to some other number ideally expecting send recv to fail.

Даже теперь функции сокета send recv успешно выполняются без выброса SOCKET_ERROR. Я ожидаю, что это должно выдать ошибку.

Я что-то не так делаю.

1 Ответ

13 голосов
/ 16 июня 2010

Это связано с особенностью дескрипторов Windows - при создании они делятся на четыре, а при использовании их два младших бита игнорируются.При увеличении дескриптора на единицу m_Socket будет ссылаться на тот же сокет, что и раньше (только при увеличении на четыре функция выдаст ошибку - если не будет открыт другой дескриптор с этим значением).

Выне следует проверять наличие открытых ручек таким образом.Хотя есть и другие способы перечисления открытых дескрипторов, вы не должны их использовать.Не зависите от системы, чтобы следить за своими ручками - следите за ними самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...