初始化代码:int InitNetCard0(HWND hWd,char *Address)
{
BOOL optval=TRUE;
int errno;
if((s1=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
{
AfxMessageBox("0号网卡的套接口初始化失败!");
return 1;
}
if(setsockopt(s1,SOL_SOCKET,SO_REUSEADDR,(char FAR*)&optval,sizeof(optval))==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的套接口地址重用设置失败!");
closesocket(s1);
return 1;
}
soin.sin_family =AF_INET;
soin.sin_port =htons(port);
soin.sin_addr.s_addr =inet_addr(Address);
if(bind(s1,(LPSOCKADDR)&soin,sizeof(soin))==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的套接口绑定失败!");
closesocket(s1);
return 1;
}
if(setsockopt(s1,SOL_SOCKET,SO_BROADCAST,(char FAR*)&optval,sizeof(optval))==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的套接口广播设定失败!");
closesocket(s1);
return 1;
}
if(WSAAsyncSelect(s1,hWd,WM_MCAST_NETREAD0,FD_READ)==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的异步选择设定失败!");
closesocket(s1);
return 1;
}
return 0;}当接收消息触发时进行数据的接收,但是这时接收的数据是否完整(发送端发送的完整数据)?
如果不完整怎样判断我收的到udp广播数据是完整的?
{
BOOL optval=TRUE;
int errno;
if((s1=socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)
{
AfxMessageBox("0号网卡的套接口初始化失败!");
return 1;
}
if(setsockopt(s1,SOL_SOCKET,SO_REUSEADDR,(char FAR*)&optval,sizeof(optval))==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的套接口地址重用设置失败!");
closesocket(s1);
return 1;
}
soin.sin_family =AF_INET;
soin.sin_port =htons(port);
soin.sin_addr.s_addr =inet_addr(Address);
if(bind(s1,(LPSOCKADDR)&soin,sizeof(soin))==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的套接口绑定失败!");
closesocket(s1);
return 1;
}
if(setsockopt(s1,SOL_SOCKET,SO_BROADCAST,(char FAR*)&optval,sizeof(optval))==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的套接口广播设定失败!");
closesocket(s1);
return 1;
}
if(WSAAsyncSelect(s1,hWd,WM_MCAST_NETREAD0,FD_READ)==SOCKET_ERROR)
{
AfxMessageBox("0号网卡的异步选择设定失败!");
closesocket(s1);
return 1;
}
return 0;}当接收消息触发时进行数据的接收,但是这时接收的数据是否完整(发送端发送的完整数据)?
如果不完整怎样判断我收的到udp广播数据是完整的?
一般都能完整接收。除非您的数据自己有关于数据完整性的描述(不如字节数),
无法判断数否完整。一般,如果数据不完整,可以直接丢弃,
Server端会重发。
struct MyPacket{
int nType;//类型定义
int len;//数据包长度
.....
};先判断收到的数据长度是否大于2*sizeof(int),不是,收到的数据不完整,是则检查收到的数据长度是否==len的长度。不是,则表示收到的数据不完整。是则完整