最近要用MFC写一个网络程序,
实现同一个IP下 TCP客户端 和2个UDP端口 同时收发数据
遇到了一个问题:
UDP1接收的数据有时会跑到UDP2这边,请问是什么原因呢,我贴出部分代码?(目前和TCP服务器以及对面2个UDP端口,一共3个端口连接,两边互发数据就会触发这个问题)//建立SOCKET
socket_udp = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
socket_udp2 = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
socket_tcp_client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);addr_tcp_target.sin_family = AF_INET;
addr_udp_target.sin_family = AF_INET;
addr_udp_target2.sin_family = AF_INET;this->GetDlgItem(IDC_IPADDRESS1)->GetWindowText(str1);this->GetDlgItem(IDC_PORT1_EDIT)->GetWindowText(str2);
this->GetDlgItem(IDC_PORT2_EDIT)->GetWindowText(str3);
this->GetDlgItem(IDC_PORT3_EDIT)->GetWindowText(str3);
m_port1 = atoi(str2.GetBuffer(1));
m_port2 = atoi(str3.GetBuffer(1));
m_port3 = atoi(str4.GetBuffer(1));
//tcp
addr_tcp_target.sin_port = ntohs(m_port1);// htons(3000);//m_port
addr_tcp_target.sin_addr.S_un.S_addr = inet_addr(str1.GetBuffer(1));//m_ip
//udp
addr_udp_target.sin_port = ntohs(m_port2);// htons(3001);//m_port
addr_udp_target.sin_addr.S_un.S_addr = inet_addr(str1.GetBuffer(1));//m_ip
addr_udp_target2.sin_port = ntohs(m_port3);// htons(3002);//m_port
addr_udp_target2.sin_addr.S_un.S_addr = inet_addr(str1.GetBuffer(1));//m_ip
//local ip&port
gethostname(hostname, sizeof(hostname));
hostent* hn;
hn = gethostbyname(hostname);//根据本机主机名得到本机ip
strIPAddr = inet_ntoa(*(struct in_addr *)hn->h_addr_list[0]);//把ip换成字符串形式//tcp
addr_tcp.sin_family = AF_INET;
addr_tcp.sin_addr.S_un.S_addr = inet_addr(strIPAddr); // 客户端地址
addr_tcp.sin_port = htons(3000); // TCP客户端为3000端口
bind(socket_tcp_client,(SOCKADDR*)&addr_tcp, sizeof(SOCKADDR)); // 客户端绑定
//udp
addr_udp.sin_family = AF_INET;
addr_udp.sin_addr.S_un.S_addr = inet_addr(strIPAddr); // 客户端地址
addr_udp.sin_port = htons(3001); // 本地UDP为3001端口
bind(socket_udp,(SOCKADDR*)&addr_udp, sizeof(SOCKADDR)); // 客户端绑定 addr_udp2.sin_family = AF_INET;
addr_udp2.sin_addr.S_un.S_addr = inet_addr(strIPAddr); // 客户端地址
addr_udp2.sin_port = htons(3002); // 本地UDP为3001端口
bind(socket_udp2,(SOCKADDR*)&addr_udp2, sizeof(SOCKADDR)); // 客户端绑定
//异步设置
if( WSAAsyncSelect(socket_tcp_client,this->m_hWnd,WM_SOCKET,FD_READ))
{
MessageBox(_T("tcp异步设置出错"),_T(""));
}
if( WSAAsyncSelect(socket_udp,this->m_hWnd,WM_SOCKET,FD_READ))
{
MessageBox(_T("udp异步设置出错"),_T(""));
}
if( WSAAsyncSelect(socket_udp2,this->m_hWnd,WM_SOCKET,FD_READ))
{
MessageBox(_T("udp2异步设置出错"),_T(""));
}
//我自定义了一个消息 OnSocket(WPARAM wParam, LPARAM lParam)接收3个端口数据
ret1=recv(socket_tcp_client,buff_tcp,146000,NULL);int n=sizeof(addr_udp_target);
ret2=recvfrom(socket_udp,buff_udp,146000,0,(sockaddr*)&addr_udp_target,&n);int n2=sizeof(addr_udp_target2);
ret3=recvfrom(socket_udp2,buff_udp2,146000,0,(sockaddr*)&addr_udp_target2,&n2);
实现同一个IP下 TCP客户端 和2个UDP端口 同时收发数据
遇到了一个问题:
UDP1接收的数据有时会跑到UDP2这边,请问是什么原因呢,我贴出部分代码?(目前和TCP服务器以及对面2个UDP端口,一共3个端口连接,两边互发数据就会触发这个问题)//建立SOCKET
socket_udp = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
socket_udp2 = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
socket_tcp_client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);addr_tcp_target.sin_family = AF_INET;
addr_udp_target.sin_family = AF_INET;
addr_udp_target2.sin_family = AF_INET;this->GetDlgItem(IDC_IPADDRESS1)->GetWindowText(str1);this->GetDlgItem(IDC_PORT1_EDIT)->GetWindowText(str2);
this->GetDlgItem(IDC_PORT2_EDIT)->GetWindowText(str3);
this->GetDlgItem(IDC_PORT3_EDIT)->GetWindowText(str3);
m_port1 = atoi(str2.GetBuffer(1));
m_port2 = atoi(str3.GetBuffer(1));
m_port3 = atoi(str4.GetBuffer(1));
//tcp
addr_tcp_target.sin_port = ntohs(m_port1);// htons(3000);//m_port
addr_tcp_target.sin_addr.S_un.S_addr = inet_addr(str1.GetBuffer(1));//m_ip
//udp
addr_udp_target.sin_port = ntohs(m_port2);// htons(3001);//m_port
addr_udp_target.sin_addr.S_un.S_addr = inet_addr(str1.GetBuffer(1));//m_ip
addr_udp_target2.sin_port = ntohs(m_port3);// htons(3002);//m_port
addr_udp_target2.sin_addr.S_un.S_addr = inet_addr(str1.GetBuffer(1));//m_ip
//local ip&port
gethostname(hostname, sizeof(hostname));
hostent* hn;
hn = gethostbyname(hostname);//根据本机主机名得到本机ip
strIPAddr = inet_ntoa(*(struct in_addr *)hn->h_addr_list[0]);//把ip换成字符串形式//tcp
addr_tcp.sin_family = AF_INET;
addr_tcp.sin_addr.S_un.S_addr = inet_addr(strIPAddr); // 客户端地址
addr_tcp.sin_port = htons(3000); // TCP客户端为3000端口
bind(socket_tcp_client,(SOCKADDR*)&addr_tcp, sizeof(SOCKADDR)); // 客户端绑定
//udp
addr_udp.sin_family = AF_INET;
addr_udp.sin_addr.S_un.S_addr = inet_addr(strIPAddr); // 客户端地址
addr_udp.sin_port = htons(3001); // 本地UDP为3001端口
bind(socket_udp,(SOCKADDR*)&addr_udp, sizeof(SOCKADDR)); // 客户端绑定 addr_udp2.sin_family = AF_INET;
addr_udp2.sin_addr.S_un.S_addr = inet_addr(strIPAddr); // 客户端地址
addr_udp2.sin_port = htons(3002); // 本地UDP为3001端口
bind(socket_udp2,(SOCKADDR*)&addr_udp2, sizeof(SOCKADDR)); // 客户端绑定
//异步设置
if( WSAAsyncSelect(socket_tcp_client,this->m_hWnd,WM_SOCKET,FD_READ))
{
MessageBox(_T("tcp异步设置出错"),_T(""));
}
if( WSAAsyncSelect(socket_udp,this->m_hWnd,WM_SOCKET,FD_READ))
{
MessageBox(_T("udp异步设置出错"),_T(""));
}
if( WSAAsyncSelect(socket_udp2,this->m_hWnd,WM_SOCKET,FD_READ))
{
MessageBox(_T("udp2异步设置出错"),_T(""));
}
//我自定义了一个消息 OnSocket(WPARAM wParam, LPARAM lParam)接收3个端口数据
ret1=recv(socket_tcp_client,buff_tcp,146000,NULL);int n=sizeof(addr_udp_target);
ret2=recvfrom(socket_udp,buff_udp,146000,0,(sockaddr*)&addr_udp_target,&n);int n2=sizeof(addr_udp_target2);
ret3=recvfrom(socket_udp2,buff_udp2,146000,0,(sockaddr*)&addr_udp_target2,&n2);
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货