本机的IP是192.168.0.2,端口是4444,现在需要监听本机的4444端口,只要来了数据(来的数据只会就是数字和字母组合),就写到一个.txt文档里面,请大家帮忙,谢谢大家了。
读出的和一个第三方软件一样的就OK了。完成了立即揭帖给分。

解决方案 »

  1.   

    抓包? 装个winpcap,有例子。
      

  2.   

    http://www.cppblog.com/niewenlong/archive/2007/07/22/28537.html端口复用技术与实现代码 
      

  3.   

    也就是实现一个最简单的服务器端,只要收,不接,不管杜塞,不管异步,甚么之类的,我的代码先设置IP,端口,在BIND,在LISTEN,最后RECV。一直取不到数据(但是数据一定是发过来的了的,有第三方软件可以看到),高手现身啊!!!!
    虽然我不是搞网络的,不过我觉得应该不是太难把。
      

  4.   

    试试winpcap
    到网上下个,里面有例子
      

  5.   

    新开个线程放RECV,做成无限循环
      

  6.   

    只要收,不接
    呵呵,有意思,矛盾
    ...........
    我的代码先设置IP,端口,在BIND,在LISTEN,最后RECV
    只Listen,没Accept?
      

  7.   

    可以类似sniff,用原始套接字监听
      

  8.   

    别人的代码
    是创建监听端口的套接字的关键部分
    m_RawSock是一个原始套接字
    你自己看看吧,或许可以帮到你int CListenDlg::CreateSock()
    {
    int err;
    char name[128];
    hostent *pHostent;
    int port=8310;
    SOCKADDR_IN sockaddr;
    m_RawSock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
    if(m_RawSock==INVALID_SOCKET)
    {
    return WSAGetLastError(); //socket创建失败
    }

    err=gethostname(name,128);
    if(err==SOCKET_ERROR)
    {
    return WSAGetLastError(); //取本机用户名失败
    } pHostent=gethostbyname (name); sockaddr.sin_family=AF_INET;
    sockaddr.sin_port=htons(port);
    memcpy(&sockaddr.sin_addr.s_addr,pHostent->h_addr_list[0],
    pHostent->h_length); //free(pHostent);

    err=bind(m_RawSock,(SOCKADDR *)&sockaddr,sizeof(sockaddr));//绑定
    if(err==SOCKET_ERROR)
    {
    return WSAGetLastError(); //取本机用户名失败
    }
    BOOL bOptval=TRUE; //设置套节字选项
    setsockopt(m_RawSock,SOL_SOCKET,SO_REUSEADDR,(char*)&bOptval,sizeof(bOptval));
    err=setsockopt(m_RawSock,IPPROTO_IP,IP_HDRINCL,(char*)&bOptval, //IP_HDRINCL该选项使之能操作IP头
    sizeof(bOptval));
    if(err==SOCKET_ERROR)
    {
    return WSAGetLastError(); //设置套节字选项失败
    } //把网卡置于混杂模式。获取IO操作的相关信息
    DWORD dwBufferLen[10] ;
    DWORD dwBufferInLen = 1 ;
    DWORD dwBytesReturned = 0 ;
    err=WSAIoctl (
    m_RawSock,                                               
    SIO_RCVALL,       //设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包                           
    &dwBufferInLen,                                     
    sizeof(dwBufferInLen),                                       
    &dwBufferLen,                                    
    sizeof(dwBufferLen),                                      
    &dwBytesReturned,                              
    NULL,                           
    NULL  
    );//最后两参数设置非阻塞
    if(err==SOCKET_ERROR)
    {
    return WSAGetLastError(); //设置套节字选项失败
    }
    return 0;
    }
      

  9.   

    回去想了一下,原来LZ的只要收,不接是这个意思啊,
    感觉语义不甚清晰,参考一下Ethereal.c
      

  10.   

    最简单的服务器端的程序,已经调试过了。你只要再判断
    来的数据是数字和字母组合,再写到一个.txt文档里面就OK了#pragma comment(lib,"WS2_32.lib")#include <winsock2.h>
    #include<iostream>
    #include<string>
    using namespace std;void main(void)
    {
       WSADATA              wsaData;
       SOCKET               ListeningSocket;
       SOCKET               NewConnection;
       SOCKADDR_IN          ServerAddr;
       SOCKADDR_IN          ClientAddr;
       int                  ClientAddrLen;
       int                  Port = 4444;
       int                  Ret;
       char                 DataBuffer[1024];
       // Initialize Winsock version 2.2   if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
       {
          cout<<"WSAStartup failed with error"<<Ret<<endl;
          return;
       }
       
       // Create a new socket to listening for client connections.
     
       if ((ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) 
           == INVALID_SOCKET)
       {
          cout<<"socket failed with error"<<WSAGetLastError()<<endl;
          WSACleanup();
          return;
       }    ServerAddr.sin_family = AF_INET;
       ServerAddr.sin_port = htons(Port);    
       ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);   // Associate the address information with the socket using bind.   if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr)) 
           == SOCKET_ERROR)
       {
          cout<<"bind failed with error"<<WSAGetLastError()<<endl;
          closesocket(ListeningSocket);
          WSACleanup();
          return;
       }   if (listen(ListeningSocket, 5) == SOCKET_ERROR)
       {
          cout<<"listen failed with error"<<WSAGetLastError()<<endl;
          closesocket(ListeningSocket);
          WSACleanup();
          return;
       }     //reuse 
        const char opt   =   1;   
        setsockopt(ListeningSocket,   SOL_SOCKET,   SO_REUSEADDR,   &opt,   sizeof(opt));   // Accept a new connection when one arrives.   if ((NewConnection = accept(ListeningSocket, (SOCKADDR *) &ClientAddr,
                                   &ClientAddrLen)) == INVALID_SOCKET)
       {
         cout<<"accept failed with error"<<WSAGetLastError()<<endl;
          closesocket(ListeningSocket);
          WSACleanup();
          return;
       }
       
       closesocket(ListeningSocket);   // receive data
       if ((Ret = recv(NewConnection, DataBuffer, sizeof(DataBuffer), 0)) 
           == SOCKET_ERROR)
       {     cout<<"recv failed with error"<<WSAGetLastError()<<endl;
          closesocket(NewConnection);
          WSACleanup();
          return;
        }
       closesocket(NewConnection);   WSACleanup();
    }
      

  11.   

    问题1:你是不是要通过GPRS实现数据的传输啊?
    如果是,那就继续问题2;如果不是,那我也不知道答案了,后面写的可以不看。问题2:你说到你的IP是192.168.0.2,那你是不是内网的?
    如果是,那就看看我的想法;如果不是,那我也不知道答案了,后面写的可以不看。我认为:问题在于你的连接没有成功地建立,数据可能发送了,但是根本就没有送到你的机器来。
    首先得知道你连接网络的真实IP,可打开www.ip.cn查到,注意,如果你没有申请固定IP,那这个IP的数值会变化的
    然后,将设置路由器端口映射到你机器
    最后,发送方连接时要用你的真实IP,然后你才能收到数
    到底数据有没有发送过来,可以通过一些第三方软件看到,例如科浪gprs测试软件
    当确定收到数据后,再测试你编写的程序吧