C/C++ code//客户端
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
#include
#include
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;
}