我在局域网中用socket进行通信,为什么发现UDP方式比TCP慢好多,UDP大概有3秒左右的延迟。
这是怎么回事?

解决方案 »

  1.   

    这个VC++深入详解里面的一个程序BOOL CChatDlg::InitSocket()
    {
    m_socket=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);
    if(INVALID_SOCKET==m_socket)
    {
    MessageBox("创建套接字失败!");
    return FALSE;
    }
    SOCKADDR_IN addrSock;
    addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrSock.sin_family=AF_INET;
    addrSock.sin_port=htons(6000);
    if(SOCKET_ERROR==bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR)))
    {
    MessageBox("绑定失败!");
    return FALSE;
    }
    if(SOCKET_ERROR==WSAAsyncSelect(m_socket,m_hWnd,UM_SOCK,FD_READ))
    {
    MessageBox("注册网络读取事件失败!");
    return FALSE;
    } return TRUE;
    }void CChatDlg::OnSock(WPARAM wParam,LPARAM lParam)
    {
    switch(LOWORD(lParam))
    {
    case FD_READ:
    WSABUF wsabuf;
    wsabuf.buf=new char[200];
    wsabuf.len=200;
    DWORD dwRead;
    DWORD dwFlag=0;
    SOCKADDR_IN addrFrom;
    int len=sizeof(SOCKADDR);
    CString str;
    CString strTemp;
    HOSTENT *pHost;
    if(SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,
    (SOCKADDR*)&addrFrom,&len,NULL,NULL))
    {
    MessageBox("接收数据失败!");
    return;
    }
    pHost=gethostbyaddr((char*)&addrFrom.sin_addr.S_un.S_addr,4,AF_INET);
    //str.Format("%s说 :%s",inet_ntoa(addrFrom.sin_addr),wsabuf.buf);
    str.Format("%s说 :%s",pHost->h_name,wsabuf.buf);
    str+="\r\n";
    GetDlgItemText(IDC_EDIT_RECV,strTemp);
    str+=strTemp;
    SetDlgItemText(IDC_EDIT_RECV,str);
    break;
    }
    }void CChatDlg::OnBtnSend() 
    {
    // TODO: Add your control notification handler code here
    DWORD dwIP;
    CString strSend;
    WSABUF wsabuf;
    DWORD dwSend;
    int len;
    CString strHostName;
    SOCKADDR_IN addrTo;
    HOSTENT* pHost;
    if(GetDlgItemText(IDC_EDIT_HOSTNAME,strHostName),strHostName=="")
    {
    ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
    addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
    }
    else
    {
    pHost=gethostbyname(strHostName);
    addrTo.sin_addr.S_un.S_addr=*((DWORD*)pHost->h_addr_list[0]);
    }

    addrTo.sin_family=AF_INET;
    addrTo.sin_port=htons(6000); GetDlgItemText(IDC_EDIT_SEND,strSend);
    len=strSend.GetLength();
    wsabuf.buf=strSend.GetBuffer(len);
    wsabuf.len=len+1; SetDlgItemText(IDC_EDIT_SEND,""); if(SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,
    (SOCKADDR*)&addrTo,sizeof(SOCKADDR),NULL,NULL))
    {
    MessageBox("发送数据失败!");
    return;
    }

    }
      

  2.   

    看不出来,用UDP不至于这么慢啊。