原始套接字UDP同一端口收发数据解决方法
原始套接字UDP同一端口收发数据
这个问题前两天问过一次了,后来我以为我可以解决了,就把帖子结了,现在问题好像还是解决不了。
问题是这样的,现在要在服务器和某一子网的一台Client上用UDP传输数据,连接由Client发起,Server的IP地址和端口都是真实的,我在Client上用一个线程绑定了一个监听端口,用来收信息,为了告诉服务器我的这个端口,我用另一个套接字同样绑定这个端口,在信息发送完成,关闭套接字后,我启动了字线程,但是这个子线程还是无法接收到服务器端返回的数据报(服务器是在接到数据报后执行了100000次的空循环后才向Client发送数据报的)。
请高手给看看,我把主要代码贴上来了:
用于做发送套接字的类CShellSendSocket的主要代码
void CShellSendSocket::InitSocket()
{
WSAStartup(MAKEWORD(2, 2), &m_wsaData);
}
void CShellSendSocket::CreateUDP(char* strIP)
{
m_SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
////设置发送所需
m_ReceiverAddr.sin_family = AF_INET;
m_ReceiverAddr.sin_port = htons(6000);
m_ReceiverAddr.sin_addr.s_addr = inet_addr(strIP);
m_LocalAddr.sin_family = AF_INET;
m_LocalAddr.sin_port = htons(9000);
m_LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(m_SendingSocket, (SOCKADDR *)&m_LocalAddr, sizeof(m_LocalAddr));
}
void CShellSendSocket::Cleanup()
{
WSACleanup();
}
void CShellSendSocket::CloseUDP()
{
closesocket(m_SendingSocket);
}
void CShellSendSocket::SendMessage(char* strMessage)
{
sendto(m_SendingSocket, strMessage, strlen(strMessage), 0, (SOCKADDR *)&m_ReceiverAddr, sizeof(m_ReceiverAddr));
}
Client线程函数
UINT RevThreadProc(LPVOID pParam)
{
WSADATA wsaData;
SOCKET ReceivingSocket;
SOCKADDR_IN ReceiverAddr;
int nPort = 9000;
char ReceiveBuf[1024];
int BufLength = 1024;
SOCKADDR_IN SenderAddr;
int SenderAddrsize = sizeof(SenderAddr);
WSAStartup(MAKEWORD(2,2), &wsaData);
ReceivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
ReceiverAddr.sin_family = AF_INET;
ReceiverAddr.sin_port = htons(nPort);
ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(ReceivingSocket, (SOCKADDR *)&ReceiverAddr, sizeof(ReceiverAddr));
while(1)
{
UINT ret = recvfrom(ReceivingSocket, ReceiveBuf, BufLength, 0, (SOCKADDR *)&SenderAddr, &SenderAddrsize);
if (ret == SOCKET_ERROR)
{
AfxMessageBox( "Err ");
}
else if(ret == 0)
{
continue;
}
这个问题前两天问过一次了,后来我以为我可以解决了,就把帖子结了,现在问题好像还是解决不了。
问题是这样的,现在要在服务器和某一子网的一台Client上用UDP传输数据,连接由Client发起,Server的IP地址和端口都是真实的,我在Client上用一个线程绑定了一个监听端口,用来收信息,为了告诉服务器我的这个端口,我用另一个套接字同样绑定这个端口,在信息发送完成,关闭套接字后,我启动了字线程,但是这个子线程还是无法接收到服务器端返回的数据报(服务器是在接到数据报后执行了100000次的空循环后才向Client发送数据报的)。
请高手给看看,我把主要代码贴上来了:
用于做发送套接字的类CShellSendSocket的主要代码
void CShellSendSocket::InitSocket()
{
WSAStartup(MAKEWORD(2, 2), &m_wsaData);
}
void CShellSendSocket::CreateUDP(char* strIP)
{
m_SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
////设置发送所需
m_ReceiverAddr.sin_family = AF_INET;
m_ReceiverAddr.sin_port = htons(6000);
m_ReceiverAddr.sin_addr.s_addr = inet_addr(strIP);
m_LocalAddr.sin_family = AF_INET;
m_LocalAddr.sin_port = htons(9000);
m_LocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(m_SendingSocket, (SOCKADDR *)&m_LocalAddr, sizeof(m_LocalAddr));
}
void CShellSendSocket::Cleanup()
{
WSACleanup();
}
void CShellSendSocket::CloseUDP()
{
closesocket(m_SendingSocket);
}
void CShellSendSocket::SendMessage(char* strMessage)
{
sendto(m_SendingSocket, strMessage, strlen(strMessage), 0, (SOCKADDR *)&m_ReceiverAddr, sizeof(m_ReceiverAddr));
}
Client线程函数
UINT RevThreadProc(LPVOID pParam)
{
WSADATA wsaData;
SOCKET ReceivingSocket;
SOCKADDR_IN ReceiverAddr;
int nPort = 9000;
char ReceiveBuf[1024];
int BufLength = 1024;
SOCKADDR_IN SenderAddr;
int SenderAddrsize = sizeof(SenderAddr);
WSAStartup(MAKEWORD(2,2), &wsaData);
ReceivingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
ReceiverAddr.sin_family = AF_INET;
ReceiverAddr.sin_port = htons(nPort);
ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(ReceivingSocket, (SOCKADDR *)&ReceiverAddr, sizeof(ReceiverAddr));
while(1)
{
UINT ret = recvfrom(ReceivingSocket, ReceiveBuf, BufLength, 0, (SOCKADDR *)&SenderAddr, &SenderAddrsize);
if (ret == SOCKET_ERROR)
{
AfxMessageBox( "Err ");
}
else if(ret == 0)
{
continue;
}