Срок действия розетки - PullRequest
       5

Срок действия розетки

2 голосов
/ 15 июня 2010

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

Если да, то как мы можем проверить, действителен ли сокет?

    SOCKET SocServer; 

    //To Set up the sockaddr structure 
    ServerSock.sin_family = AF_INET; 
    ServerSock.sin_addr.s_addr = INADDR_ANY     
    ServerSock.sin_port = htons(PortNumber);//port number of 5005 

    // To Create a socket for listening on PortNumber 
    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; 
    }

Я знаю, что ямогу проверить наличие INVALID_SOCKET, что другими словами означает, что сокет равен 0. Есть ли другой выход, потому что мой SocServer будет иметь значение скажем 2500, я хочу проверить, действителен ли этот сокет.

Ответы [ 5 ]

6 голосов
/ 15 июня 2010

Передайте свой сокет любой из функций сокетов Windows (например, getsockopt()), если сокет недействителен, он вернет SOCKET_ERROR, а WSAGetLastError() вернет WSAENOTSOCK.

Важно отметить, что INVALID_SOCKET не равно 0 (фактическое значение, которое вы не должны использовать специально, равно ((SOCKET)(~0))

3 голосов
/ 15 июня 2010

Сокет может стать «недействительным», когда любая из сторон (ожидаемая или неожиданная) отключается, но не случайно, из-за сетевых помех (если не отключается, см. Выше).

Вы можете обнаружить это, проверив возвращаемые значения send() и recv() для -1 (SOCKET_ERROR)

1 голос
/ 15 июня 2010

Во-первых, предполагая, что INVALID_SOCKET (который вы не показываете) на самом деле определен как 0, это неверно. socket возвращает -1 при сбое, как и другие системные вызовы (0 - допустимый fd, который может быть возвращен).

Затем, как только вы примете соединение, ваш send / write или recv / read вызовет -1. Если вы пытаетесь написать, errno будет установлен на EPIPE, чтобы указать, что сокет был закрыт (вашим клиентом). Нельзя просто спросить, закрыта ли розетка.

1 голос
/ 15 июня 2010

Сокет не станет недействительным. Но после прослушивания () вы должны принять () соединение. Эта связь может быть потеряна в какой-то момент. Это может быть обнаружено по ошибке записи в сокет или recv () с ошибкой Затем вы просто возвращаетесь к listen ().

0 голосов
/ 14 июля 2012

Сокет (родительский) будет действителен до тех пор, пока указатель файла не будет освобожден (что произойдет только при закрытии), хотя вы не можете использовать его, поскольку он не подключен ни к какому клиенту.

...