vc6.0 MFC 先用udp广播,再client建立连接,新手求大神解答

huangpan_123 2014-07-24 10:00:00
delphi 里面是
IdudpServer1.Broadcast('EASYNET',120); //广播

IdUDPServer1UDPRead 事件里:
IP := ABinding.PeerIP; //获取设备ip端口
port := ABinding.port;

按钮事件里:
ClientSocket1.Active:=False; //建立连接
ClientSocket1.Host:=IP;
ClientSocket1.Port:=120;
ClientSocket1.Active:=True;


用MFC怎么实现啊。。

我现在 MFC 里面 最基础的广播 都有点问题啊:

CString msg = "EASYNET";
SOCKADDR_IN addr;

int broad = 1;

SOCKET fd = socket(AF_INET,SOCK_DGRAM,0);

setsockopt(fd,SOL_SOCKET,SO_BROADCAST,(const char *)&broad,sizeof(broad));

addr.sin_addr.S_un.S_addr= INADDR_BROADCAST;

addr.sin_family = AF_INET;

addr.sin_port = htons(120);

sendto(fd,msg,strlen(msg)+1,0,(SOCKADDR *)&addr,sizeof(SOCKADDR));
...全文
223 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangpan_123 2014-07-24
  • 打赏
  • 举报
回复
SOCKADDR_IN addr = {0}; SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(INVALID_SOCKET == sock) { WSACleanup(); //goto __CLEANUP__; } addr.sin_family = AF_INET; addr.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST); addr.sin_port = htons(120); BOOL bBroadcast = TRUE; if(SOCKET_ERROR == setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(bBroadcast))) { WSACleanup(); //goto __CLEANUP__; } if(SOCKET_ERROR == sendto(sock, (char*)"EASYNET", sizeof("EASYNET"), 0, (LPSOCKADDR)&addr, sizeof(addr))) { // } 但是 link怎么设置啊: LEDDemTestDlg.obj : error LNK2001: unresolved external symbol __imp__sendto@24 LEDDemTestDlg.obj : error LNK2001: unresolved external symbol __imp__setsockopt@20 LEDDemTestDlg.obj : error LNK2001: unresolved external symbol __imp__htons@4 LEDDemTestDlg.obj : error LNK2001: unresolved external symbol __imp__htonl@4 LEDDemTestDlg.obj : error LNK2001: unresolved external symbol __imp__WSACleanup@0 LEDDemTestDlg.obj : error LNK2001: unresolved external symbol __imp__socket@12
qq_18239273 2014-07-24
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
SOCKADDR_IN addr = {0};
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if(INVALID_SOCKET == sock)
	{
		goto __CLEANUP__;
	}

	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);
	addr.sin_port = htons(DEFAULT_BROADCAST_PORT);
	BOOL bBroadcast = TRUE;

	if(SOCKET_ERROR == setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(bBroadcast)))
	{
		goto __CLEANUP__;
	}

if(SOCKET_ERROR == sendto(sock, (char*)szIpAddress, sizeof(szIpAddress), 0, (LPSOCKADDR)&addr, sizeof(addr)))
					{

					}
比如我知道控制卡的固定端口是120,那addr.sin_port = htons(120); 而且szIpAddress就是我要填入的广播内容吗, 但是__CLEANUP__ 未定义,需要声明哪个?
Eleven 2014-07-24
  • 打赏
  • 举报
回复
SOCKADDR_IN addr = {0};
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if(INVALID_SOCKET == sock)
	{
		goto __CLEANUP__;
	}

	addr.sin_family = AF_INET;
	addr.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);
	addr.sin_port = htons(DEFAULT_BROADCAST_PORT);
	BOOL bBroadcast = TRUE;

	if(SOCKET_ERROR == setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(bBroadcast)))
	{
		goto __CLEANUP__;
	}

if(SOCKET_ERROR == sendto(sock, (char*)szIpAddress, sizeof(szIpAddress), 0, (LPSOCKADDR)&addr, sizeof(addr)))
					{

					}
oyljerry 2014-07-24
  • 打赏
  • 举报
回复
广播后是什么问题,抓包分析一下
huangpan_123 2014-07-24
  • 打赏
  • 举报
回复
huangpan_123 2014-07-24
  • 打赏
  • 举报
回复
SOCKET sock; //socket套接字 unsigned long ip; char szMsg[] = "EASYNET";//被发送的字段 WORD wVersionRequested; //1.启动SOCKET库,版本为2.0 WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 0 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( 0 != err ) //检查Socket初始化是否成功 { MessageBox("Socket2.0初始化失败,Exit!");//<<"Socket2.0初始化失败,Exit!"; return; } if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )//检查Socket库的版本是否为2.0 { WSACleanup( ); return; } sock = socket( //2.创建socket, AF_INET, //internetwork: UDP, TCP, etc SOCK_DGRAM, //SOCK_DGRAM说明是UDP类型 0 //protocol ); if (INVALID_SOCKET == sock ) { MessageBox("Socket 创建失败,Exit!");//cout<<"Socket 创建失败,Exit!"; return; } bool opt = true; setsockopt(sock, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char FAR *>(&opt), sizeof(opt));//3.设置该套接字为广播类型 sockaddr_in addrto; //设置发往的地址 memset(&addrto,0,sizeof(addrto)); addrto.sin_family = AF_INET; //地址类型为internetwork addrto.sin_addr.s_addr = INADDR_BROADCAST; //设置ip为广播地址 addrto.sin_port = htons(120); //端口号为120 bind(sock,(SOCKADDR*)&addrto,sizeof(addrto));//绑定 int nlen=sizeof(addrto); unsigned int uIndex = 1; while(true) { Sleep(1000); //程序休眠一秒 if( sendto(sock, szMsg, strlen(szMsg), 0, (sockaddr*)&addrto,nlen)== SOCKET_ERROR )//广播 MessageBox((LPCTSTR)WSAGetLastError); else { MessageBox( "an UDP package is sended."); //接收数据 CHAR szBuff[100]={0}; SOCKADDR_IN clientAddr={0}; int nLen=sizeof(clientAddr); recvfrom(sock,szBuff,100,0,(SOCKADDR*)&clientAddr,&nLen); ip = clientAddr.sin_addr.S_un.S_addr; MessageBox((LPCTSTR)ip); } } if (!closesocket(sock)) //关闭套接字 { WSAGetLastError(); return; } if (!WSACleanup()) //关闭Socket库 { WSAGetLastError(); return; } 这个是UDP 广播 我怎么获取广播后对方的IP ,我的band和 recvfrom是不是有问题?
qq_18356739 2014-07-24
  • 打赏
  • 举报
回复
udp广播成功以后,怎么获取到应答的 对象IP 就像 dlphi 里的 IdUDPServer1UDPRead 事件: IP := ABinding.PeerIP; //获取设备ip端口 port := ABinding.port;
huangpan_123 2014-07-24
  • 打赏
  • 举报
回复
OK连接问题 解决了,我调试下,,
项目工程资源经过测试运行,功能上ok,可复现复刻,拿到资料包后可实现复刻出一样的项目,本人系统开发经验充足(全栈),有任何使用问题欢迎随时与我联系,我会努力及时为您解惑,提供帮助 【资源内容】:包含源码、工程文件等。资源质量优质,放心下载使用!可参考实现复现;设计报告也可借鉴此项目工程;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,及时抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 质量优质,放心下载使用。下载后请首先打开说明文件(如有);项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途,网络商品/电子资源资料具可复制性不支持退款。质量优质,放心下载使用。

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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