使用API函数 Accept 对方的Socket连接请求后,该如何提取对方的端口号?

解决方案 »

  1.   

     有个叫什么getip 之类的函数的 自己上网搜索下  我以前用过
      

  2.   

    我给楼主写了个Serve
     #include <stdio.h>
    #include <Winsock2.h>
    #include <iostream>#pragma  comment(lib, "ws2_32.lib")  
    void main()
    {
    WSADATA wsaData;
    int err;

    err = WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
    if ( err != 0 ) 
    {
    return;
    }

    if (LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) 
    {
    WSACleanup( );
    return;
    } SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(5150);

    bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

    listen(sockSrv,5);

    SOCKADDR_IN addrClient;
    int len= sizeof(SOCKADDR);
    while(1)
    {
    SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len); unsigned int port;
    in_addr Serve_addr;  
    port = ntohs(addrClient.sin_port);  CopyMemory(&Serve_addr, &(addrClient.sin_addr), sizeof(Serve_addr));
    printf("IP:  %s\n", inet_ntoa(Serve_addr)); 
            printf("端口号为:%d \n", port);

    char sendBuf[50];
    sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
    send(sockConn,sendBuf,strlen(sendBuf)+1,0);
    char recvBuf[50];
    recv(sockConn,recvBuf,50,0);
    printf("%s\n",recvBuf);
    closesocket(sockConn);
    }

    }Client#include <stdio.h>
    #include <Winsock2.h>#pragma  comment(lib, "ws2_32.lib")  
    void main()
    {
      WORD wVersionRequested;
      WSADATA wsaData;
      int err = WSAStartup(MAKEWORD( 1, 1 ), &wsaData );  if ( err != 0 )
      {
        return;
      }
     
      if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ) 
      {
        WSACleanup( );
        return;
     }
      SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);
     
      SOCKADDR_IN addrSrv;
      addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
      addrSrv.sin_family = AF_INET;
      addrSrv.sin_port = htons(5150);
      connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
      send(sockClient, "Test", strlen("Test")+1,0);
      char recvBuf[50];
      int Rec_len = recv(sockClient,recvBuf,50,0);
      if (recv(sockClient,recvBuf,50,0) != - 1)
      {
        printf("receive %s %d\n",recvBuf, Rec_len);
      }
      
      closesocket(sockClient);
      WSACleanup();
    }
      

  3.   

    楼主要的就是
    SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len); unsigned int port;
    in_addr Serve_addr;  
    port = ntohs(addrClient.sin_port);  CopyMemory(&Serve_addr, &(addrClient.sin_addr), sizeof(Serve_addr));
    printf("IP:  %s\n", inet_ntoa(Serve_addr)); 
            printf("端口号为:%d \n", port);这段
      

  4.   

    accept函数的第二个参数是接收客户端连接的地址信息,里面包含对方的IP地址和端口号
    我想你会用bind就会用SOCKADDR_IN结构吧