这里是例程:我在应答客户端的时候,我要怎么才能得到客户端的IP地址?
#include <winsock.h>
#include "scompat.h"
#include <stdio.h>int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)

WSADATA wsaData; WSAStartup(0x101,&wsaData);
struct sockaddr_in sa; 
sa.sin_family = PF_INET; 
sa.sin_port = htons(8888); 
sa.sin_addr.s_addr = INADDR_ANY; 
SOCKET listen_sd;
int sa_len = sizeof(sa);
listen_sd=socket(PF_INET, SOCK_STREAM, 0);
bind(listen_sd, (struct sockaddr far *)&sa, sizeof(sa));
listen(listen_sd, 5);
ServerLoop(listen_sd,1);
WSACleanup();
return 0;
}void ServeAClient(LPVOID lpv)
{   SOCKET sd_accept = (SOCKET) lpv;
char frist[6];
BYTE Text[100], s_Text[100], s_CrypText[100];
if(recv(sd_accept, ( char *)Text, sizeof(Text), 0)<0){closesocket(sd_accept);return;}
strcpy(( char *)s_Text, "OKOKOK"); //请问我在这里要怎么才能得到客户端的IPfor(int i=0;i<6;i++)
frist[i]=s_Text[i];
send(sd_accept, frist, 6, 0);
closesocket(sd_accept);
return;
}#define   MAX_SERVED   200000
int ServerLoop(SOCKET sd_listen, int isMultiTasking)
{
    SOCKET sd_accept;
    struct sockaddr_in addr_client;
    int err, nSize;
    int numServed = 0;
    HANDLE handles[MAX_SERVED];
    unsigned long myID;
      while (1) {      nSize = sizeof(addr_client);
      sd_accept = accept(sd_listen, (struct sockaddr *)
                         &addr_client, &nSize);
      ServeAClient((LPVOID) sd_accept);
 if (sd_accept == INVALID_SOCKET)continue;
              handles[numServed] = CreateThread(NULL, 0,
                      (LPTHREAD_START_ROUTINE)ServeAClient,
                      (LPVOID) sd_accept, 0, &myID);         CloseHandle(handles[numServed]);
  if (numServed==MAX_SERVED)
  {WaitForMultipleObjects(MAX_SERVED, handles,TRUE,INFINITE);
  numServed=0;
  }
      numServed++;
      }    if (isMultiTasking) {
#ifdef _WIN32
        err = WaitForMultipleObjects(MAX_SERVED, handles,TRUE,INFINITE);
        printf("Last thread to finish was thread #%d\n", err);
#endif
        }
    return 0;
}

解决方案 »

  1.   

    accept(sd_listen, (struct sockaddr *)&addr_client, &nSize);
    这里已经得到客户端的地址,传递给相关的代码就可以了
      

  2.   

    通过sockadd-in,调用函数(具体名字找msdn),可以的到ip,
      

  3.   

    char szHostname[100]; if( gethostname( szHostname, sizeof( szHostname ))!=SOCKET_ERROR) 

    HOSTENT *pHostEnt = gethostbyname(szHostName); if ( pHostEnt != NULL ) 

    // Use the pHostEnt->h_addr_list to get IP address } 

      

  4.   

    http://www.yesky.com/20010409/168706.shtml
    http://school.enet.com.cn/eschool/inforcenter/A20040315294550.html
      

  5.   

    首先感谢大家的热情发言,同时也给了我不少建议。to: 回复人: top_hipster(top_hipster) 
    accept(sd_listen, (struct sockaddr *)&addr_client, &nSize);
    这里已经得到客户端的地址,传递给相关的代码就可以了不错,客户端的IP已经在addr_client结构中了,但我的问题是如何
    在CreateTherad API中传递给线程ServeAClient(不用全局变量)CreateThread(NULL, 0,
                          (LPTHREAD_START_ROUTINE)ServeAClient,
                          (LPVOID) sd_accept, 0, &myID);
      

  6.   

    在CreateTherad API中传递给线程ServeAClient(不用全局变量)CreateThread(NULL, 0,
                          (LPTHREAD_START_ROUTINE)ServeAClient,
                          (LPVOID) sd_accept, 0, &myID);
    还要这样给呀,不会了。客户端取得自身IP再传回来用在这里就不行么?
      

  7.   

    to:回复人: gagamazel(猪十年) 客户端取得自身IP再传回来用在这里就不行么?客户端的自身IP有些是内网IP,唉