这里是例程:我在应答客户端的时候,我要怎么才能得到客户端的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;
}
#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;
}
这里已经得到客户端的地址,传递给相关的代码就可以了
{
HOSTENT *pHostEnt = gethostbyname(szHostName); if ( pHostEnt != NULL )
{
// Use the pHostEnt->h_addr_list to get IP address }
}
http://school.enet.com.cn/eschool/inforcenter/A20040315294550.html
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);
(LPTHREAD_START_ROUTINE)ServeAClient,
(LPVOID) sd_accept, 0, &myID);
还要这样给呀,不会了。客户端取得自身IP再传回来用在这里就不行么?