/******************************************************************** IP网段0~255通过for逐一发送字符
**********************************************************************/
.............
DWORD dwIP;
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;//套接字地址赋值,套接字m_socket为该类的全局变量
addrTo.sin_port=htons(21454); for(i=0;i<256;i++) { str_SendIP=str_ip1+"."+str_ip2+"."+str_ip3+".";
str_i.Format("%d",i);//将int i转化为CString i if(str_i==str_ip4)//本机IP if(i<256) { str_SendIP+=str_i;
/************通过弹窗查看,所获得的IP并没有错误,确实是局域网内的所有IP地址**********/
//MessageBox(str_SendIP);
//将CString 型IP地址转化为DWORD
dwIP= ntohl( inet_addr(str_SendIP)); addrTo.sin_addr.S_un.S_addr=htonl(dwIP); sendto(m_socket,"X",1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR)); } }我局域网内的其他设备设置为接收到X,就回发特定格式消息“ABCD”/********************************************************************主机接收响应消息为一个不断工作的线程:*********************************************************************/UINT CMyDlg::RecvProc2(LPVOID pParam){ //获取主线传递的套接字和窗口句柄 SOCKET socket=((recvparam*)pParam)->socket; HWND hwnd=((recvparam*)pParam)->hwnd; delete pParam; SOCKADDR_IN addrFrom; int len=sizeof(SOCKADDR); char recvBuf[3000]="";//初始化
char tempBuf[4000]=""; int retval;
CString str;
while(TRUE) { //接收数据 retval=recvfrom(socket,recvBuf,3000,0,(SOCKADDR*)&addrFrom,&len); if(SOCKET_ERROR==retval) break; sprintf(tempBuf,"%s-%s",inet_ntoa(addrFrom.sin_addr),recvBuf);//消息发送方的IP转换为字符数组 str=tempBuf;/**********但是此处用弹窗验证,发现没有接收到消息***********************/
AfxMessageBox(str); ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//将内容传给主窗口 }return 0;}
我用抓包工具查看,发现,主机发送给局域网设备的消息是正常的,都是X,
局域网内回发到指定端口的消息中,虽然很多,但也存在复合要求的消息格式
但为什么程序就是没反应,接收不到呢?????
**********************************************************************/
.............
DWORD dwIP;
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;//套接字地址赋值,套接字m_socket为该类的全局变量
addrTo.sin_port=htons(21454); for(i=0;i<256;i++) { str_SendIP=str_ip1+"."+str_ip2+"."+str_ip3+".";
str_i.Format("%d",i);//将int i转化为CString i if(str_i==str_ip4)//本机IP if(i<256) { str_SendIP+=str_i;
/************通过弹窗查看,所获得的IP并没有错误,确实是局域网内的所有IP地址**********/
//MessageBox(str_SendIP);
//将CString 型IP地址转化为DWORD
dwIP= ntohl( inet_addr(str_SendIP)); addrTo.sin_addr.S_un.S_addr=htonl(dwIP); sendto(m_socket,"X",1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR)); } }我局域网内的其他设备设置为接收到X,就回发特定格式消息“ABCD”/********************************************************************主机接收响应消息为一个不断工作的线程:*********************************************************************/UINT CMyDlg::RecvProc2(LPVOID pParam){ //获取主线传递的套接字和窗口句柄 SOCKET socket=((recvparam*)pParam)->socket; HWND hwnd=((recvparam*)pParam)->hwnd; delete pParam; SOCKADDR_IN addrFrom; int len=sizeof(SOCKADDR); char recvBuf[3000]="";//初始化
char tempBuf[4000]=""; int retval;
CString str;
while(TRUE) { //接收数据 retval=recvfrom(socket,recvBuf,3000,0,(SOCKADDR*)&addrFrom,&len); if(SOCKET_ERROR==retval) break; sprintf(tempBuf,"%s-%s",inet_ntoa(addrFrom.sin_addr),recvBuf);//消息发送方的IP转换为字符数组 str=tempBuf;/**********但是此处用弹窗验证,发现没有接收到消息***********************/
AfxMessageBox(str); ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);//将内容传给主窗口 }return 0;}
我用抓包工具查看,发现,主机发送给局域网设备的消息是正常的,都是X,
局域网内回发到指定端口的消息中,虽然很多,但也存在复合要求的消息格式
但为什么程序就是没反应,接收不到呢?????
解决方案 »
- 我现在有个静态框,通过GetDlgItem(IDC_STATIC1)->GetWindowRect(&m_static1)获得静态框尺寸。
- VC listCtrl控件多选的问题
- 求助,图像处理如何入手?
- 一个SDK小问题
- 谁有DIB的类?
- 国内哪里有微软最新的SDK下载 微软网站太慢了。急!
- 求教高手一个函数
- 用vc怎么实现类似于word中插入数学符号(比如积分符号)的功能
- 各位大使,我定义了一个外部变量,但编译时却提示“无法解析的外部符号...”
- 处理消息号为512时消息,出现Access Violation怎么办呀?
- DrawText时如果换掉黑色,我用想用的颜色?
- 请问存储过程中如何提取查询的结果,谢谢
//获取主线传递的套接字和窗口句柄 SOCKET socket=((recvparam*)pParam)->socket; HWND hwnd=((recvparam*)pParam)->hwnd;
这个无效
socket这个套接字端口是不是21454
楼主,你之前绑定IP和Port的代码我们看不见啊,你都封装了,另外防火墙什么都关掉了吧?因此
目前只能断点retval=recvfrom(socket,recvBuf,3000,0,(SOCKADDR*)&addrFrom,&len);
看看问题了
BOOL CMyDlg::InitSocket()
{
//创建套接字
m_socket=socket(AF_INET,SOCK_DGRAM,0);
if(INVALID_SOCKET==m_socket)//创建失败会返回INVALID_SOCKET
{
MessageBox("套接字创建失败!");
return FALSE;
} SOCKADDR_IN addrsock;
addrsock.sin_family=AF_INET;//协议地址族
addrsock.sin_port=htons(21454);//分配端口号
addrsock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//确定可接收发送到本地的任意IP地址的数据 //绑定套接字库
int retval;
retval=bind(m_socket,(SOCKADDR*)&addrsock,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)//绑定失败会返回SOCKET_ERROR
{
closesocket(m_socket);
MessageBox("绑定套接字库失败!");
return FALSE;
}
return TRUE;
}
//结构体初始化
recvparam *pRecvParam=new recvparam;
pRecvParam->socket=m_socket;
pRecvParam->hwnd=m_hWnd;
//创建接收线程
CWinThread* pCWinThread=AfxBeginThread(RecvProc2,(LPVOID)pRecvParam);
然后在搜素设备并发送完消息处设置一断点,retval显示“Not Found”
**********************************************************************/
.............
DWORD dwIP;
SOCKADDR_IN addrTo;
addrTo.sin_family=AF_INET;//套接字地址赋值,套接字m_socket为该类的全局变量
addrTo.sin_port=htons(21454); for(i=0;i<256;i++) { str_SendIP=str_ip1+"."+str_ip2+"."+str_ip3+".";
str_i.Format("%d",i);//将int i转化为CString i if(str_i==str_ip4)//本机IP if(i<256) { str_SendIP+=str_i;
/************通过弹窗查看,所获得的IP并没有错误,确实是局域网内的所有IP地址**********/
//MessageBox(str_SendIP);
//将CString 型IP地址转化为DWORD
dwIP= ntohl( inet_addr(str_SendIP)); addrTo.sin_addr.S_un.S_addr=htonl(dwIP); sendto(m_socket,"X",1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR)); } }我局域网内的其他设备设置为接收到X,就回发特定格式消息“ABCD”/********************************************************************主机接收响应消息为一个不断工作的线程:*********************************************************************/UINT CMyDlg::RecvProc2(LPVOID pParam){ //获取主线传递的套接字和窗口句柄 SOCKET socket=((recvparam*)pParam)->socket; HWND hwnd=((recvparam*)pParam)->hwnd; delete pParam;
这里不应该delete吧.