Socket Udp广播同一端口收发绑定

lzjdlsl 2012-12-14 09:02:57
这样的。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;
}
...全文
514 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzjdlsl 2012-12-14
  • 打赏
  • 举报
回复
Ok了。转化不对。谢谢你了。非常感谢
lzjdlsl 2012-12-14
  • 打赏
  • 举报
回复
发送时成功的。接收那边解析sin_port和发的时候绑定的10000不一样啊
lzjdlsl 2012-12-14
  • 打赏
  • 举报
回复
非常感谢。我试了下还是不行啊。请帮忙再看下。
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));


SOCKADDR_IN Sevr;
Sevr.sin_family = AF_INET;
Sevr.sin_addr.s_addr = inet_addr("10.90.69.131");//改成自己机器的IP
//SEND_PORT为宏定义。发送源端口。10000
Sevr.sin_port = htons(SEND_PORT);//自己注意大小端
if(bind(sock, (SOCKADDR *)&Sevr, sizeof(Sevr)) == SOCKET_ERROR) //绑定套接字
{
AfxMessageBox("sock bind error code!");
closesocket(sock);

}


int length;
//对方给的协议在这边。
char msg[1];
msg[0] = 0x80;

//8代表为长度。可以根据情况修改。
length=sendto(sock,msg,1, 0, (SOCKADDR*)&sin, sizeof(sin));
if(length<=0)
{
AfxMessageBox("Send data error!");
closesocket(sock);
return;
}
傻X 2012-12-14
  • 打赏
  • 举报
回复
本地地址才是用来bind的
傻X 2012-12-14
  • 打赏
  • 举报
回复
楼主概念错误 SOCKADDR_IN sin;这个是发送地址,也就是对方接收的地址 所以你要自己再建立一个本地地址绑定 SOCKADDR_IN Sevr; Sevr.sin_family = AF_INET; Sevr.sin_addr.s_addr = //改成自己机器的IP //SEND_PORT为宏定义。发送源端口。10000 Sevr.sin_port = htons(SEND_PORT);//自己注意大小端

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧