【问题标题】:Error in assigning port number to socket using newSocket.sin_port = htons(portNumber);使用 newSocket.sin_port = htons(portNumber) 将端口号分配给套接字时出错;
【发布时间】:2013-06-12 10:00:48
【问题描述】:

我正在尝试分配一个函数传递给它的端口号。接收到的端口号在收到时正确显示,但是当我尝试将该端口号分配给新的 Socket 时,该端口号未分配,并且每次都分配了其他编号 52428。我尽力自己找出错误但我失败了:(请帮助我。下面是我的代码:

DWORD WINAPI newrecvThreadProcedure(LPVOID param)
{       
   newRecvThreadDetailStruct* myDetailStruct =  (newRecvThreadDetailStruct*) (param);
   char ipNumber[12], newDetail[256], threadNumber_char[12], 
        *detail =    myDetailStruct>newsocketDetail;
   int portNumber, threadNumber_int = myDetailStruct->threadNum; 
   sscanf(detail,"%s %d",ipNumber,&portNumber);
   char displayPortNum[12];
   itoa(portNumber,displayPortNum,10);
   MessageBox( NULL, displayPortNum,"portnumber", MB_ICONINFORMATION); //Port Number displayed here is the value that I want i.e. 8880 
// =======================================================================================
// Creating New Socket Now
   WSADATA wsa; 

   //Initialise winsock
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {
    //"WinSock Initialization FAILED"
        return 0;
      }

   //Create a socket
   SOCKET newSocketIdentifier;
   SOCKADDR_IN newSocket;
   if((newSocketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      {
        //"Socket Creation Failed",
         exit(EXIT_FAILURE);
      }
   //Socket Created

   //Prepare the sockaddr_in structure
   newSocket.sin_family = AF_INET;
   newSocket.sin_addr.s_addr = INADDR_ANY;
   newSocket.sin_port = htons(portNumber);
   char char_port[12],*client_ip = inet_ntoa(newSocket.sin_addr); 
   int int_port = ntohs(newSocket.sin_port);
   itoa(int_port,char_port,10);
   MessageBox( NULL,char_port,client_ip,MB_ICONEXCLAMATION | MB_OK);  /* Port number 
displayed here is 52428 and IP Address is 0.0.0.0*/
}

【问题讨论】:

    标签: c windows sockets visual-studio-2008 network-programming


    【解决方案1】:

    字符串缓冲区ipNumber 太小。它只有 12 个字符,但完整的 IP 可能是 "255.255.255.255",即 16 个字符(包括终止符)。

    因此,您可能会出现缓冲区溢出,从而导致未定义的行为。

    您应该使用调试器查看结构的各个字段,看看一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-30
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多