(1)客户端代码
#include "iostream"
#include "winsock2.h"
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define GETIP 0x101
#define SENTIP 0x102
typedef struct
{
int type;
DWORD IP;
}IPPACK;
int main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2), &wsadata);
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(2000);
bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN));
bool nBuflen = true;
int optlen = sizeof(nBuflen);
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&nBuflen, optlen);
IPPACK data;
data.type = GETIP;
SOCKADDR_IN addrto, addrfrom;
addrto.sin_addr.S_un.S_addr = INADDR_BROADCAST; // inet_addr("172.1.31.1");
addrto.sin_port = htons(2000);
addrto.sin_family = AF_INET;
sendto(sock, (char*)&data, sizeof(DWORD), 0, (SOCKADDR*)&addrto, sizeof(SOCKADDR));
int len = sizeof(SOCKADDR);
while(1)
{
recvfrom(sock, (char*)&data, sizeof(IPPACK), 0, (SOCKADDR*)&addrfrom, &len);
if (data.type == SENTIP)
{
break;
}
}
cout<<inet_ntoa(*(IN_ADDR*)&data.IP)<<endl;
system("pause");
return 0;
}
(2)服务端代码
#include "iostream"
#include "winsock2.h"
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define GETIP 0x101
#define SENTIP 0x102
typedef struct
{
int type;
DWORD IP;
}IPPACK;
int main()
{
WSADATA wsadata;
WSAStartup(MAKEWORD(2,2), &wsadata);
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(2000);
if(bind(sock, (SOCKADDR*)&addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
return -1;
char name[1024];
HOSTENT * host;
IPPACK data, temp;
int len = sizeof(SOCKADDR);
gethostname(name, 1024);
host = gethostbyname(name);
memmove(&data.IP, host->h_addr_list[0], 4);
data.type = SENTIP;
SOCKADDR_IN addrfrom;
while(1)
{
recvfrom(sock, (char*)&temp, sizeof(IPPACK), 0, (SOCKADDR*)&addrfrom, &len);
//cout<<WSAGetLastError()<<endl;
sendto(sock, (char*)&data, sizeof(IPPACK), 0, (SOCKADDR*)&addrfrom, sizeof(SOCKADDR));
//cout<<inet_ntoa(*(IN_ADDR*)&data.IP)<<endl;
}
return 0;
}