2010-06-15 3 views
0

У меня есть эта часть кода, в которой создается сокет сервера, и он настроен на прослушивание определенного номера порта 5005. Теперь, когда функция accept socket возвращает созданный сокет, копируется в переменную m_Socket и, наконец, я выключил серверный сокет с именем SocServer, который был создан локально.Создано одно и то же создание сокета

Теперь мой вопрос Возможно ли, что SocServer (созданный первоначально) и m_Socket (копировались, когда принимаем возврат) получить тот же номер 1500. сказать

struct sockaddr_in ServerSock;      // Socket address structure to bind the Port Number to listen to 

    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(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; 
    } 

    // 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 
    m_Socket=accept(SocServer,(struct sockaddr*)&insock,&insocklen); 
    //delete the server socket 
    if(SocServer != INVALID_SOCKET) 
    { 
     //To close and shutdown the Socserver 
     shutdown(SocServer, 2);  
     closesocket(SocServer); 
    } 

возможно, что Socserver и m_socket одинаковы потому что

согласно моему коду установлено соединение сокета, и по какой-то другой причине он закрывается, а в TCPView он показывается установленным на некоторое время, а затем нет соединения вообще.

Примечание: Это происходит только на некоторых машинах и не воспроизводится всегда. Может быть причиной любой другой проблемы, связанной с сетью.

+1

Вы обеспокоены тем, что ваш m_Socket может быть закрыт, когда вы вызываете shutdown на Socserver? – Default

+1

Вы скоро вызываете WSACleanup? Я также попытался описать программирование сокетов: http://stackoverflow.com/questions/2843277/c-winsock-p2p/2920787#2920787 – Default

+0

@ Майкл, я не могу слишком много жаловаться на код. Это устаревшая часть кода, над которой я сейчас работаю. Я не называю WSACleanup слишком рано. Так что это правит. И да, я беспокоюсь, что m_Socket может быть закрыт, когда я вызываю shutdown на SocServer. – ckv

ответ

2

Вы уверены, что клиент, который подключается к вашему серверу, не закрыл соединение? Кроме того, вы не указали какую-либо функцию, которая использует m_Socket, поэтому я не могу сказать вам, есть ли какие-либо проблемы при обработке входящего соединения. Я не думаю, что m_socket и SocServer могут закончиться тем же.

+0

Вы имеете в виду, что m_Socket и SocServer никогда не могут быть одинаковыми? – ckv

+1

Правильно, поскольку SocServer (должен) быть допустимым сокетом во время принятия, m_Socket должен быть другим (иначе это было бы ОЧЕНЬ странное поведение accept). – PeterK

+0

Да, мне любопытно узнать больше об этом странном поведении, потому что мы серьезно сомневаемся в этом происшествии – ckv

1

В этом коде:

m_Socket=accept(SocServer,(struct sockaddr*)&insock,&insocklen); 
if(SocServer != INVALID_SOCKET) 

почему вы называете принять() с тем, что, возможно, по-видимому, быть плохой сокет? И вы проверяете ценность, которую вы получаете от accept() в любом месте?

+0

Нет, я не проверю значение, которое возвращается с accept(). – ckv

+2

@viswanathan Ну, do - это скорее код ошибки, чем сокет. В общем, вы должны проверить возвращаемое значение каждой функции API каждого сокета, которую вы вызываете, и выпустить соответствующую диагностику при ошибке. – 2010-06-15 11:07:50

+0

@Neil как часть очистки кода я проверю на достоверность сокета. Между тем m_Socket и SocServer могут быть одинаковыми. – ckv