https://my.oschina.net/lopo/blog/260685
//客户端
#include <winsock2.h> #include <stdio.h> #include <windows.h> #pragma comment(lib,"ws2_32.lib") #include <tchar.h> #include<ws2tcpip.h> int main() { //初始化套接字 WSADATA wsaData; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("初始化套接字失败!\n"); return -1; } printf("初始化套接字成功!\n"); //建立客户端SOCKET SOCKET client; client=socket(AF_INET,SOCK_DGRAM,0); if(client==INVALID_SOCKET) { printf("建立客户端套接字失败; %d\n",WSAGetLastError()); WSACleanup(); return -1; } printf("建立客户端套接字成功!\n"); sockaddr_in serveraddress; //加入组播 struct ip_mreq mreq; memset(&mreq,0,sizeof(struct ip_mreq)); mreq.imr_multiaddr.S_un.S_addr=inet_addr("224.168.00.01"); //组播源地址 mreq.imr_interface.S_un.S_addr=INADDR_ANY; //本地地址 int m=setsockopt(client,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char FAR *)&mreq,sizeof(mreq)); if(m==SOCKET_ERROR) { perror("setsockopt"); return -1; } //接收数据 char recvbuf[1000000]; //回头注意重新设定缓冲区大小 int n; DWORD dwWrite; //DWORD在windows下常用来保存地址(或者存放指针) BOOL bRet; int len=sizeof(sockaddr_in); //创建文件 HANDLE hFile=CreateFile(_T("E:\实验室\YUV格式\shipin.yuv"),GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0); if(hFile!=INVALID_HANDLE_VALUE) { printf("创建文件成功!\n"); } while(1) { n=recvfrom(client,recvbuf,sizeof(recvbuf),0,(sockaddr*)&serveraddress,&len); if(n==SOCKET_ERROR) { printf("recvfrom error:%d\n",WSAGetLastError()); printf("接收数据错误!\n"); } //将接收到的数据写到hFile中 bRet=WriteFile(hFile,recvbuf,n,&dwWrite,NULL); if(bRet==FALSE) { MessageBox(NULL,_T("Write Buf ERROR!"),_T("ERROR"),MB_OK); break; } } //传送成功 MessageBox(NULL,_T("Receive file OK!"),_T("OK"),MB_OK); closesocket(client); WSACleanup(); return 0; } //组播客户端 #include <winsock2.h> #include <stdio.h> #include <ws2tcpip.h> #pragma comment(lib,"ws2_32.lib") int main() { WSADATA wsadata; SOCKET socklistener; char buffer[1000] = {0}; SOCKADDR_IN sin,saclient; int nSize,nbSize; int err; int iAddrLen = sizeof(saclient); err=WSAStartup(MAKEWORD(2,2),&wsadata); if(err != 0) { return -1; } char hostname[128]; struct hostent*pHost; int nfds; struct timeval tv; fd_set readfds; socklistener = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); unsigned long cmd = 1; int status = ioctlsocket(socklistener,FIONBIO,&cmd); if(gethostname(hostname,128)==0) { printf("%s\n",hostname);//计算机名字 } pHost = gethostbyname(hostname); sin.sin_family =AF_INET; sin.sin_port = htons(319); sin.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)pHost->h_addr_list[1])); printf("ip %s\n",inet_ntoa(*(struct in_addr*)pHost->h_addr_list[1])); if(bind(socklistener,(SOCKADDR FAR*)&sin,sizeof(sin)) != 0) { return -2; } //添加组 struct ip_mreq imr; int sm; memset(&imr,0,sizeof(struct ip_mreq)); imr.imr_multiaddr.S_un.S_addr = inet_addr("224.0.1.129"); imr.imr_interface.S_un.S_addr = inet_addr(inet_ntoa(*(struct in_addr*)pHost->h_addr_list[1])); sm = setsockopt(socklistener,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char FAR*)&imr,sizeof(struct ip_mreq)); if(SOCKET_ERROR == sm) { printf("add member error\n"); return FALSE; } nfds = socklistener; tv.tv_sec = 10; tv.tv_usec = 2; while(1) { FD_ZERO(&readfds); FD_SET(nfds,&readfds); sm = select(nfds + 1,&readfds,0,0,&tv); sm = FD_ISSET(nfds,&readfds); if(sm < 0) { printf("select error\n"); } nSize = sizeof(SOCKADDR_IN); if((nbSize = recvfrom(socklistener,buffer,1000,0,(SOCKADDR FAR *)&saclient, &nSize)) == SOCKET_ERROR) { printf("receive Error\n"); continue; } buffer[nbSize] = '\0'; printf("success\n"); } WSACleanup(); return 0; } 服务端 const int MAX_BUF_LEN = 255; int main(int argc, char* argv[]) { WORD wVersionRequested; WSADATA wsaData; int err; // 启动socket api wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return -1; } if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( ); return -1; } // 创建socket SOCKET connect_socket; connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(INVALID_SOCKET == connect_socket) { err = WSAGetLastError(); printf("socket error! error code is %d/n", err); return -1; } char hostname[128]; struct hostent*pHost; if(gethostname(hostname,128)==0) { printf("%s\n",hostname);//计算机名字 } pHost = gethostbyname(hostname); printf("ip %s\n",inet_ntoa(*(struct in_addr*)pHost->h_addr_list[0])); SOCKADDR_IN sin; sin.sin_family = AF_INET; sin.sin_port = htons(321); sin.sin_addr.s_addr = inet_addr("224.0.1.129");//组播地址 bool bOpt = true; //设置该套接字为广播类型 setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)); int nAddrLen = sizeof(SOCKADDR); char buff[MAX_BUF_LEN] = ""; int nLoop = 0; while(1) { nLoop++; sprintf(buff, "