我写的服务程序是发现当接受大约6000字节的时候,接收需要10ms。而当发送60字节的时候需要200ms,不知道为什么?急!!
服务端和客户端分别运行在两台机器上,会出现上述情况,若运行在同一台机器上则不会出现上述情况

解决方案 »

  1.   

    接收代码如下:
    int sockRecvData(unsigned int& Sock,char* precvbuf,long Data_Length)
    {

    int rval=0;
    SOCKET sock=(SOCKET)(Sock);
    char receivebuf[NORMALBUFFERSIZE]; //接收数据的缓存
    long Data_Count = 0; //收到的数据总量
    int recvBuf_Length = 0; //单次收到的数据量
    WSAEVENT event = ::WSACreateEvent();
    ::WSAEventSelect(sock, event,FD_READ);
    long recvstarttime=GetTickCount();
    int nRet = ::WaitForSingleObject(event, WAIT_FOR_RECV_TIME);//5*1000);

    if(nRet == WSA_WAIT_TIMEOUT) // 定时显式状态信息
    {
    printf("----ERROR:Wait For Recv Data TimeOut----\n");
    rval=-4;//等待超时
    }
    else
    {
    while(1)
    {
    memset(receivebuf,0,sizeof(receivebuf));
    int recvLength=(Data_Length-Data_Count)<NORMALBUFFERSIZE ?(Data_Length-Data_Count):NORMALBUFFERSIZE;
    recvBuf_Length = recv(sock,receivebuf,recvLength,0); //接收一次数据
    if(recvBuf_Length==-1) //-1,网络错误
    {
    int err=WSAGetLastError();
    if(err==10035||err==6)
    {
    Sleep(5);
    printf("dddddddddddddddddd\n");
    continue;
    }
    else
    {
    Data_Count=-1;
    break;
    }
    }
    if(recvBuf_Length>0)
    {
    memcpy(&precvbuf[Data_Count],receivebuf,recvBuf_Length); //将每次收到的数据放到recvBuf中
    Data_Count+=recvBuf_Length;
    } //把单次收到的数据长度累加
    if(recvBuf_Length==0)
    {
    int closeerr=WSAGetLastError();
    if(Data_Count!=Data_Length)
    Data_Count=-1;
    break;
    }
    if(Data_Count == Data_Length) //收到的数据总长度等于要接收的数据总长度,跳出
    break;      
    }
    }
    WSACloseEvent(event);
    long recvendtime=GetTickCount();
    printf("recv data used time %d\n",recvendtime-recvstarttime); return Data_Count;
    }
    发送时先发送个包头,然后发送内容。
    结果发现当接收内容时若发送的字节数为60则会在 int nRet = ::WaitForSingleObject(event, WAIT_FOR_RECV_TIME);//5*1000);
    等待大约200ms,若发送的字节数为6000则只会等待10ms不知道为什么?
    盼高手答复
      

  2.   

    在发送端设置:
    BOOl Val=TRUE;
    setsockopt(s,IPPROTO_TCP,TCP_NODELAY,&Val,sizeof(BOOL));