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

 

#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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值