【网络开发】winsock组播

    xiaoxiao2021-03-25  118

    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, "
    转载请注明原文地址: https://ju.6miu.com/read-2265.html

    最新回复(0)