简单写一个加入组播组接收到数据的代码
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; }
相关文章推荐
- CUDA编程_DEBUG_01
- java nio
- 浅克隆与深克隆的区别-java
- Java向MySQL数据库插入时间类型Date数据时需要注意的问题
- OJ在线判题注意事项(C++版)
- thinkphp报错 找不到think/log
- Eclipse CDT
- java获取当前日期时间代码
- QTableWidget使用注意要点总结
- eclipse使用
- KVM源代码分析2:虚拟机的创建与运行
- KVM源代码分析1:基本工作原理
- AOS 自动生成代码支持其它操作系统
- Java键盘字符乱码判断代码
- C语言之冒泡法排序
- 自定义注解之源码注解(RetentionPolicy.SOURCE)
- Java 并发编程实战 摘要
- 关于eclipse安装PyDev后preference下始终没有Pydev选项的解决方案
- Java基础知识[0]
- C#之冒泡法排序