您的位置:首页 > 编程语言

简单写一个加入组播组接收到数据的代码

2016-08-04 16:53 495 查看
#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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: