多个计算机使用UDP通信,如下图所示:
计算机B作为计算机A和计算机C的接收方,需要绑定多个IP地址,这时需要分别弄两个初始化函数initnetwork和initnetwork2.
主要代码实现为
BOOL m_NetOk;
BOOL netstart;
UINT RevThread(LPVOID pParam);
struct sockaddr_in sinself;
struct sockaddr_in sin3;
SOCKET srecv;
BOOL m_NetOk2;
BOOL netstart2;
UINT RevThread2(LPVOID pParam);
struct sockaddr_in sindata;
SOCKET srecv2;
int sendlen;
unsigned char recvframe[30000];
unsigned char recvframe2[30000];
unsigned int recvnum;
int tmp111 = 32768000;
int tmp222 = 32768000;
m_NetOk = InitNetwork();
netstart = m_NetOk;
RevT = AfxBeginThread(RevThread, this, THREAD_PRIORITY_HIGHEST, 0, 0, NULL);
m_NetOk2 = InitNetwork2();
netstart2 = m_NetOk;
RevT = AfxBeginThread(RevThread2, this, THREAD_PRIORITY_HIGHEST, 0, 0, NULL);
BOOL CDisplayDlg::InitNetwork()
{
int sock_reuse = 1;
int tmp;
wVersionRequested = MAKEWORD(1, 1);
tmp = WSAStartup(wVersionRequested, &wsaData);
if (tmp != 0)
{
AfxMessageBox(L"\r\nUnable to initialize WinSock for host info");
return 0;
}
memset(&sinself, 0x0, sizeof(sinself));
memset(&sin3, 0x0, sizeof(sin3));
// Create the recv socket. This is the socket on which we'll
// receive image data
srecv = socket(AF_INET, SOCK_DGRAM, 0);
if (srecv == INVALID_SOCKET)
{
AfxMessageBox(L"failed socket (%d)\n", WSAGetLastError());
return 0;
}
sinself.sin_family = AF_INET;
// sinself.sin_addr.s_addr = INADDR_ANY;
sinself.sin_addr.s_addr = inet_addr("192.168.1.11"); //本地 模拟综合管理机
sinself.sin_port = htons(5200);
sin3.sin_family = AF_INET;
sin3.sin_port = htons(5190);
sin3.sin_addr.s_addr = inet_addr("192.168.1.22"); //图像处理板图像通道
sendlen = sizeof(sin3);
if (::bind(srecv, (sockaddr*)&sinself, sizeof(sinself)) == SOCKET_ERROR)
AfxMessageBox(L"bind error!");
setsockopt(srecv, SOL_SOCKET, SO_RCVBUF, (char *)&tmp111, sizeof(int));
// AfxMessageBox("Fully Connected!\n");
return 1;
}
BOOL CDisplayDlg::InitNetwork2()
{
int sock_reuse = 1;
int tmp;
wVersionRequested = MAKEWORD(1, 1);
tmp = WSAStartup(wVersionRequested, &wsaData);
if (tmp != 0)
{
AfxMessageBox(L"\r\nUnable to initialize WinSock for host info");
return 0;
}
memset(&sinself2, 0x0, sizeof(sinself2));
memset(&sindata, 0x0, sizeof(sindata));
// Create the recv socket. This is the socket on which we'll
// receive image data
srecv = socket(AF_INET, SOCK_DGRAM, 0);
if (srecv == INVALID_SOCKET)
{
AfxMessageBox(L"failed socket (%d)\n", WSAGetLastError());
return 0;
}
sinself2.sin_family = AF_INET;
// sinself.sin_addr.s_addr = INADDR_ANY;
sinself2.sin_addr.s_addr = inet_addr("192.100.1.11"); //本地 模拟综合管理机
sinself2.sin_port = htons(6000);
sindata.sin_family = AF_INET;
sindata.sin_port = htons(6500);
sindata.sin_addr.s_addr = inet_addr("192.100.1.22"); //图像处理板图像通道
sendlen = sizeof(sindata);
if (::bind(srecv2, (sockaddr*)&sinself2, sizeof(sinself2)) == SOCKET_ERROR)
AfxMessageBox(L"bind error!");
setsockopt(srecv2, SOL_SOCKET, SO_RCVBUF, (char *)&tmp222, sizeof(int));
// AfxMessageBox("Fully Connected!\n");
return 1;
}
UINT RevThread(LPVOID pParam)
{
CDisplayDlg * p_dlg = (CDisplayDlg*)pParam;
int len, fromlen;
fromlen = sizeof(sin3);
unsigned short nowframe;
while (1)
{
if (netstart)
{
len = recvfrom(srecv, (char *)&recvframe[0], 20520, 0, (sockaddr*)&sin3, &fromlen);
}
}
}
}
UINT RevThread2(LPVOID pParam)
{
CDisplayDlg * p_dlg = (CDisplayDlg*)pParam;
int len, fromlen;
fromlen = sizeof(sindata);
unsigned short nowframe;
while (1)
{
if (netstart2)
{
{
len = recvfrom(srecv2, (char *)&recvframe2[0], 20520, 0, (sockaddr*)&sindata, &fromlen);
}
}
}
}