/********************************************************************    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,
局域网内回发到指定端口的消息中,虽然很多,但也存在复合要求的消息格式
但为什么程序就是没反应,接收不到呢?????

解决方案 »

  1.   

    SOCKADDR_IN addrFrom;主机接收响应的地址族、端口、还有地址什么的你都没指定吧,这样你调用API函数recvfrom(socket,recvBuf,3000,0,(SOCKADDR*)&addrFrom,&len);接收数据,从哪接收呢,你必须指定接收响应的那些信息吧,某拙见,仅供参考!
      

  2.   

    有的,传递进来了
     //获取主线传递的套接字和窗口句柄 SOCKET socket=((recvparam*)pParam)->socket; HWND hwnd=((recvparam*)pParam)->hwnd;
      

  3.   

    retval=recvfrom(socket,recvBuf,3000,0,(SOCKADDR*)&addrFrom,&len);
    这个无效
      

  4.   

    你Debug调试一下你的线程函数recvfrom有返回不?线程函数中用到的SOCKET句柄有效不?
      

  5.   

    recvfrom(socket,recvBuf,3000,0,(SOCKADDR*)&addrFrom,&len);
    socket这个套接字端口是不是21454
      

  6.   


    楼主,你之前绑定IP和Port的代码我们看不见啊,你都封装了,另外防火墙什么都关掉了吧?因此
    目前只能断点retval=recvfrom(socket,recvBuf,3000,0,(SOCKADDR*)&addrFrom,&len);
    看看问题了
      

  7.   

    /***********************这是SOCKET初始化*************************/
    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;
    }
      

  8.   

    这是在OnInitDlg中传递值给接收线程的代码
    //结构体初始化
    recvparam *pRecvParam=new recvparam;

    pRecvParam->socket=m_socket;
    pRecvParam->hwnd=m_hWnd;
      //创建接收线程
    CWinThread* pCWinThread=AfxBeginThread(RecvProc2,(LPVOID)pRecvParam);
      

  9.   

    我在recvfrom设置断点,retval一开始的值是-858993460
    然后在搜素设备并发送完消息处设置一断点,retval显示“Not Found”
      

  10.   

    /********************************************************************   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;
      这里不应该delete吧.
      

  11.   

    其实不delete好像没差别,一次传递,while运行