Socket Udp广播同一端口收发绑定
这样的。Udp广播我需要接受和发送都在同一个端口。比如10000,但是发送的时候如果绑定端口的话提示失败,如果不绑定端口的话可以发送出去。不过端口变成了系统随机分配的可用端口。怎么样才能发的时候绑定端口。接收的时候显示的是10000这个端口呢。
//点击按钮发送数据。
SOCKET sock;
SOCKADDR_IN sin;
UpdateData(true);
//upd
//sock=socket(AF_INET,SOCK_DGRAM,0);
sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(sock == SOCKET_ERROR)
{
AfxMessageBox("Sock create fail!");
return;
}
sin.sin_family = AF_INET;
//地址为广播。
sin.sin_addr.s_addr = INADDR_BROADCAST;
//SEND_PORT为宏定义。发送的端口。8089
sin.sin_port = htons(SEND_PORT);
bool bOpt = true;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&bOpt,sizeof(bOpt));
int length;
//对方给的协议在这边。
char msg[8];
//内容省略
if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR) //绑定套接字
{
AfxMessageBox("sock bind error code!");
closesocket(sock);
}
length=sendto(sock,msg,8, 0, (SOCKADDR*)&sin, sizeof(sin));
if(length<=0)
{
AfxMessageBox("Send data error!");
closesocket(sock);
return;
}
起来一个线程作为接收
UINT thread(LPVOID v)
{
CUDPDlg *dlg = (CUDPDlg *)AfxGetApp()->GetMainWnd(); //取得主窗口的句柄
SOCKET sock;
SOCKADDR_IN sin;
//sock = socket(AF_INET,SOCK_DGRAM,0);
sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); //建立UDP套接字
if(sock == SOCKET_ERROR)
{
AfxMessageBox("Sock create fail!");
return -1;
}
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
//接收的端口宏定义。8080
sin.sin_port = htons(RECV_PORT);
//将套接字绑定
/*bool bOpt = true;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&bOpt,sizeof(bOpt));*/
if(bind(sock, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR) //绑定套接字
{
AfxMessageBox("sock bind error code!");
closesocket(sock);
return -1;
}
while(true)
{
char szBuffer[4096];
DWORD dwRead = 0;
SOCKADDR sa;
int nLen;
int nSaLen = sizeof(sa);
//接收等待。对方的socket
nLen = recvfrom(sock, szBuffer, sizeof(szBuffer), 0, &sa, &nSaLen);
if(nLen<=0)
{
AfxMessageBox("Data receive fail!");
closesocket(sock);
WSACleanup();
return -1;
}
else
{
if(dlg->m_strRecv.Compare("Waiting......") == 0)
{
dlg->m_ctlRecv.SetWindowText("receive success!"); //设置编辑控件的内容
}
CString strIPAddress = inet_ntoa(((SOCKADDR_IN *)&sa)->sin_addr); //取IP地址
WORD wPort = ((SOCKADDR_IN *)&sa)->sin_port; //取端口号
CString str_Port;
str_Port.Format("%d",wPort);
char s[1024];
dlg->m_strRecv.Empty(); //清空m_strRecv
dlg->m_ctlRecv.GetWindowText(s,dlg->m_ctlRecv.GetWindowTextLength()+1); //得到编辑控件的内容,存入s
CTime timeNow = CTime::GetCurrentTime(); //取现在时间
CString strTime = timeNow.Format("%H:%M:%S"); //时间格式化
CString recv;
int i=0;
while(s[i]!='\0')
{
recv+=s[i];
i++;
}
recv += "\r\n";
recv += "\r\n";
recv += "IP:";
recv += strIPAddress;
recv += "\t";
recv += "Port:";
recv += str_Port;
recv += "\t";
recv += strTime;
recv += "\r\n";
recv += szBuffer;
dlg->m_ctlRecv.SetWindowText(recv);
}
}
closesocket(sock);
AfxEndThread(0);
return 0;
}