最近要用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);
uj5u.com熱心網友回復:
發送和接收端把 IP地址和埠輸出日志,對比, 看是接收的問題、發送問題、還是處理上的問題uj5u.com熱心網友回復:
當某一套介面s上發生了一個已命名的網路事件,應用程式視窗hWnd會接收到訊息wMsg.wParam引數標識了網路事件發生的套介面你應該根據wParam去判斷是哪個socket有資料來,不會的話,就定義3個訊息,每個socket對應一個訊息,不會混亂
uj5u.com熱心網友回復:
嘗試了給UDP1單獨定義一個訊息,還是一個毛病
uj5u.com熱心網友回復:
接收代碼的沒問題,看下發送的是不是把socket搞混了uj5u.com熱心網友回復:
WM_SOCKET+1 WM_SOCKET+2 不要多個公用一個訊息id
uj5u.com熱心網友回復:
沒什么用,我給UDP1單獨加了一個訊息,一個毛病
uj5u.com熱心網友回復:
發代碼給我,我幫你看轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/26923.html
標籤:網絡編程
上一篇:VC做界面
下一篇:VS2010部署的問題
