#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32.lib")
DWORD WINAPI ThreadProc1 (PVOID pParam)
{
SOCKET *socketFd = (SOCKET *)pParam;
if (socketFd ==NULL)
{
printf("ThreadProc1 : sockedFd null\n");
}
printf("in thread \n");
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
while (1)
{
char recvData[255];
int ret = recvfrom(*socketFd, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);
if (ret > 0)
{
recvData[ret] = 0x00;
printf("收到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
for (int i =0; i < ret; i++)
{
printf("%02x",recvData[i]&0xff);
if ((i+1)%4 ==0)
{
printf(" ");
}
if ((i+1)%16 == 0)
{
printf("\n");
}
}
printf("\n");
}
}
}
int main(int argc, char *argv[])
{
SOCKET serSocket;
WSADATA wsaData;
WORD sockVersion = MAKEWORD(2,2);
int optval;
optval=1;
if(WSAStartup(sockVersion, &wsaData) != 0)
{
return 0;
}
serSocket = socket(AF_INET, SOCK_DGRAM,IPPROTO_IP);
if (serSocket == INVALID_SOCKET)
{
printf("socket error !!\n");
return -1;
}
if(setsockopt(serSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)) < 0) //将SOKCET地址置为可重用
{
printf("setsockopt 1 error !!\n");
return -1;
}
sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(5100);
serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
{
printf("bind error !\n");
closesocket(serSocket);
return -1;
}
struct ip_mreq ipmr;
ipmr.imr_interface.s_addr = htonl(INADDR_ANY);
ipmr.imr_multiaddr.s_addr = inet_addr("10.8.59.186");
int flag;
if (setsockopt(serSocket, IPPROTO_IP, IP_MULTICAST_IF, (char*)&ipmr, sizeof(ipmr))<0)
{
printf("setsockopt 2 error !!\n");
return -1;
}
flag = 64;
if(setsockopt(serSocket, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&flag, sizeof(flag))!=0)
{
printf("setsockopt 3 error !!\n");
return -1;
}
flag =0;
if (setsockopt(serSocket, IPPROTO_IP, IP_MULTICAST_LOOP,(char *)&flag, sizeof(flag)) == SOCKET_ERROR)
{
closesocket(serSocket);
printf("setsockopt 4error !!\n");
return -1;
}
HANDLE handle1=CreateThread(NULL,0,ThreadProc1,( LPVOID )&serSocket,0,NULL);
printf("is ready, please enter the multiAddress \n");
char multiAddress[64];
scanf("%s", multiAddress);
// 将ip地址加入组播组。
struct ip_mreq ipMreq;
ipMreq.imr_interface.s_addr = htonl(INADDR_ANY);
ipMreq.imr_multiaddr.s_addr = inet_addr(multiAddress);
if (setsockopt(serSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&ipMreq, sizeof(ipMreq)) < 0)
{
closesocket(serSocket);
printf("setsockopt 5error !!\n");
return -1;
}
while (1)
{
Sleep(1000);
}
closesocket(serSocket);
CloseHandle(handle1);
return 0;
}