我写的一个非面向连接的本地Socket程序,用于向远端发出请求,并从远端接收发来的连续包。
(1)关键代码如下:
if(sendto(sSessionSock,(char*)m_cpData,packetLen,0,
(struct sockaddr*)&s_remote_addr,sizeof(s_remote_addr))==SOCKET_ERROR)
        {
                     MessageBox(NULL,"Send SOL_Command Failure!",
  "Error",MB_OK|MB_ICONERROR);
return 1;
   
        }
while(connection)
{
 if(recvfrom(sSessionSock,(char*)recv_buf,100,0,
   (struct sockaddr*)&s_remote_addr,&length)==SOCKET_ERROR)
  {
  MessageBox(NULL,"Receive SOL_Response Packets Failure!",
  "Error",MB_OK|MB_ICONERROR);
return 1;
  }

   printf("\nReceive SOL Packet %d As Follows:\n",connection++);
   for(i=0;i<100;i++) printf("%5x",recv_buf[i]);
   memset(recv_buf,0x00,100);
}
(2)出现的现象:
    收到远端发来的第一个包以后,收不到其他的包。但本地Sniffer能捕获到发来的连续不断的包。(3)请高手多给意见。

解决方案 »

  1.   

    发送端每次发送完之后调用一下Sleep()函数,发送速度就提高了。
      

  2.   

    (一)我再说明几个条件:(1)远端是硬件平台,收到特定格式的请求包后,便会连续不断地返回平台信息数据包(2)硬件平台不可编程(二)另外,我用完全软件方法在本地编了一对非面向连接的收发程序,验证连续收发成功。所以非常郁闷,为什么硬件平台发来的东西我无法连续接收呢?下面是本地收发实验程序:(1)发送程序
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    int nRetCode = 0;
    int i;

    WSADATA wsd;
    CString     csTmp;
    SOCKET      sSessionSock;
    sockaddr_in addr_to;
    unsigned char *m_cpData;
    int ret,timeout = 100;
    int connection=1;
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
    // TODO: change error code to suit your needs
    cerr << _T("Fatal Error: MFC initialization failed") << endl;
    nRetCode = 1;
    }
    else
    {
    // TODO: code your application's behavior here.
    CString strHello;
    strHello.LoadString(IDS_HELLO);
    cout << (LPCTSTR)strHello << endl;
    } if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
    {
    MessageBox(NULL,"Windows Socket Start Failure!","SOCKET Error",
    MB_OK|MB_ICONERROR);
    return  1;
    } //Create Session Socket,If failure,return error code. 
    sSessionSock = socket(AF_INET,SOCK_DGRAM,0);
    if(sSessionSock == INVALID_SOCKET)
    {
    csTmp.Format("%d",WSAGetLastError());
    MessageBox(NULL,"Create Socket Error! Code:"+csTmp,"Socket Error",
    MB_OK|MB_ICONERROR);
    return 1;
    }
    //set send timeout control
    ret = setsockopt(sSessionSock,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,
    sizeof(timeout));
    if(ret == SOCKET_ERROR)
    {
    csTmp.Format("%d",WSAGetLastError());
    MessageBox(NULL,"Setting Socket Attribute Error!","Error",
    MB_OK|MB_ICONERROR);
    return 1;
    }
    addr_to.sin_family = AF_INET;
    addr_to.sin_port = htons((unsigned short)5050);
    addr_to.sin_addr.s_addr = inet_addr("10.130.2.36");

        m_cpData = (unsigned char*)malloc(60*sizeof(char));
    while(connection)
    {

           memset(m_cpData,connection,60);
    ret = sendto(sSessionSock,(char*)m_cpData,60,0,(struct sockaddr*)&addr_to,
    sizeof(addr_to));
    connection++;
    printf("\n\nSend out:\n");
    for(i=0;i<60;i++)
    printf("%5d",m_cpData[i]);
    }

    return nRetCode;
    }
    (2)接收程序:
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    int nRetCode = 0;
    int i;
    int length;

    WSADATA wsd;
    CString     csTmp;
    SOCKET      Sock;
    sockaddr_in from,local;
    unsigned char *m_cpData;
    int ret,timeout = 160;
    int connection=1;
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
    // TODO: change error code to suit your needs
    cerr << _T("Fatal Error: MFC initialization failed") << endl;
    nRetCode = 1;
    }
    else
    {
    // TODO: code your application's behavior here.
    CString strHello;
    strHello.LoadString(IDS_HELLO);
    cout << (LPCTSTR)strHello << endl;
    } if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
    {
    MessageBox(NULL,"Windows Socket Start Failure!","SOCKET Error",
    MB_OK|MB_ICONERROR);
    return  1;
    } //Create Session Socket,If failure,return error code. 
    Sock = socket(AF_INET,SOCK_DGRAM,0);
    if(Sock == INVALID_SOCKET)
    {
    csTmp.Format("%d",WSAGetLastError());
    MessageBox(NULL,"Create Socket Error! Code:"+csTmp,"Socket Error",
    MB_OK|MB_ICONERROR);
    return 1;
    } //-------------------------NOTICE!!-----------------------------------
    //................SET RECEIVE TIME-OUT CONTROL.......................
        
    /* ret = setsockopt(Sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
    if(ret == SOCKET_ERROR)
    {
    csTmp.Format("%d",WSAGetLastError());
    MessageBox(NULL,"Setting Socket Attribute Error!","Error",
    MB_OK|MB_ICONERROR);
    return 1;
    }
    */
    //Initialize & Bind Local Address from.sin_family = AF_INET;
    from.sin_port = htons((unsigned short)5050);
    from.sin_addr.s_addr = inet_addr("10.130.2.36"); local.sin_family = AF_INET;
    local.sin_addr.s_addr = (INADDR_ANY);
        local.sin_port = htons((unsigned short)5050); ret = bind(Sock,(struct sockaddr*)&local,sizeof(local));
    if(ret == SOCKET_ERROR)
    {
    csTmp.Format("%d",WSAGetLastError());
    MessageBox(NULL,"Bind Local Address/Port Failure! Code:"+csTmp,"Error",
    MB_OK|MB_ICONERROR);
    return 1;
    }

        m_cpData = (unsigned char*)malloc(60*sizeof(char));
    memset(m_cpData,0x00,60);
    length=sizeof(from);
    while(connection)
    {

           
    ret = recvfrom(Sock,(char*)m_cpData,60,0,(struct sockaddr*)&from,
    &length);
    if(ret==SOCKET_ERROR) 
    {
    printf("\nBig Failure!\n");
    break; }
    printf("\n\nReceive:\n");
    for(i=0;i<60;i++)
    printf("%5d",m_cpData[i]);
    }
    return nRetCode;
    }