最近要用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);

解决方案 »

  1.   

    当某一套接口s上发生了一个已命名的网络事件,应用程序窗口hWnd会接收到消息wMsg.wParam参数标识了网络事件发生的套接口你应该根据wParam去判断是哪个socket有数据来,不会的话,就定义3个消息,每个socket对应一个消息,不会混乱
      

  2.   

    尝试了给UDP1单独定义一个消息,还是一个毛病
      

  3.   

    接收代码的没问题,看下发送的是不是把socket搞混了
      

  4.   

    WM_SOCKET+1  WM_SOCKET+2 不要多个公用一个消息id
      

  5.   

    没什么用,我给UDP1单独加了一个消息,一个毛病