首页 新闻 会员 周边

Socket编程

0
悬赏园豆:20 [已解决问题] 解决于 2013-09-22 19:03

急!!!!!用TCP收发大数据(512k,1M,8M),在局域网内可以收到全部数据,但是通过外网发送每次只能收到不到10k的数据,为什么啊????

//接收数据线程
if(SOCKET_ERROR==listen(pDlg->m_MySocket,256))
    {
        CString strError;
        strError.Format("%d",WSAGetLastError());
        AfxMessageBox(strError);
        return FALSE;
    }

    SOCKADDR_IN addrClient;
    
    for ( ; ; )
    {
        int len=sizeof(SOCKADDR);
        SOCKET conn=accept(pDlg->m_MySocket,(SOCKADDR*)&addrClient,&len);
        if (conn==INVALID_SOCKET)
        {
            AfxMessageBox("连接出错!");
            return FALSE;
        }
        int recvCount = 0;
        memset(chConrecvMsg, 0, sizeof(chConrecvMsg));
        recvCount = recv(conn,chConrecvMsg,sizeof(chConrecvMsg),0);
        if (recvCount <=0)
        {
            pDlg->SetDlgItemText(IDC_STC_SENDCOUNT, "发包数:0个");
            pDlg->SetDlgItemText(IDC_STC_RECVCOUNT, "收包数:0个");
            pDlg->SetDlgItemText(IDC_STC_DELAY, "累积延时:0s");
            pDlg->SetDlgItemText(IDC_STC_AVARDELAY, "平均延时:0s");
            pDlg->SetDlgItemText(IDC_STC_DATASIZE, "实收字节数:0");
            pDlg->SetDlgItemText(IDC_STC_MISSDATACOUNT, "误包数:0个");

            pDlg->m_nRecvCount = 0;
            pDlg->m_nDelayTime = 0;
            pDlg->m_nMissDataCount = 0;
        }
        else if (recvCount < 30)
        {
            if (FALSE == pDlg->TimeSync(chConrecvMsg))
            {
                pDlg->SetDlgItemText(IDC_STC_RECVSTATUS, "时间同步失败");
                //return FALSE;
            }
        }
        else
        {
            if (FALSE == pDlg->DealMsg(chConrecvMsg))
            {
                pDlg->SetDlgItemText(IDC_STC_RECVSTATUS, "数据丢失");
                //return FALSE;
            }
        }
        pDlg->SetDlgItemText(IDC_STC_RECVSTATUS, "接收中……");
    
        closesocket(conn);
    }
    
    closesocket(pDlg->m_MySocket);
//发送数据的线程
unsigned __stdcall CNetTestToolDlg::SendMsgThread( void* pArguments )
{
    CNetTestToolDlg *pDlg=(CNetTestToolDlg*)pArguments;

    SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
    if ( INVALID_SOCKET==sockClient)
    {
        AfxMessageBox("创建套接字失败(客户端发送消息)!");
        return FALSE;
    }

    DWORD dwIP;
    CString strPort;

    pDlg->m_IPaddr.GetAddress(dwIP);
    pDlg->GetDlgItemText(IDC_EDIT_PORT, strPort);
    pDlg->m_wPort = atoi(strPort);

    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr=htonl(dwIP);
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_port=htons(pDlg->m_wPort);

    if(SOCKET_ERROR==connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)))
    {
        AfxMessageBox("连接出错!");
        pDlg->m_bThreadError = true;
        closesocket(sockClient);
        return FALSE;
    }

    char* chSendMsg = new char[8*1024*1024+1];
    memset(chSendMsg, 0, sizeof(chSendMsg));
    pDlg->PackMsg(&chSendMsg);
    if(SOCKET_ERROR==send(sockClient,chSendMsg,strlen(chSendMsg)+1,0))
    {
        AfxMessageBox("发送失败!");
        pDlg->m_bThreadError = true;
        closesocket(sockClient);
        return FALSE;
    }
    delete []chSendMsg;
    
    if (pDlg->m_bSendFlag)
    {
        pDlg->m_nSendCount++;//发送成功,发包数加1
        CString strStatus;
        strStatus.Format("发包数:%d个", pDlg->m_nSendCount);
        pDlg->SetDlgItemText(IDC_STC_SENDCOUNT, strStatus);//在“收发状态”栏中显示发包数
    }
    closesocket(sockClient);
    return 0;
}
问题补充:

这是编写的软件的界面:

胡小颖颖的主页 胡小颖颖 | 初学一级 | 园豆:180
提问于:2013-09-11 15:23
< >
分享
最佳答案
1

你只接受了一次,数据可能有无数个包,单你只接受了一次,应该循环判断是否有数据,然后接受,包的大小是TCP控制的,你写入1M TCP会自己给你拆分成包,陆游器一般不会限制

收获园豆:10
56180825 | 小虾三级 |园豆:1756 | 2013-09-11 20:32

对的,我在接收的时候一直while直到接收到我要的数据就ok了,谢谢回答

胡小颖颖 | 园豆:180 (初学一级) | 2013-09-22 18:59
其他回答(4)
0

公网中某些路由设备是有最大传输包大小限制的。

收获园豆:3
sinhbv | 园豆:2579 (老鸟四级) | 2013-09-11 16:06
0

可能是路由器限制了包的大小

收获园豆:1
dudu | 园豆:30994 (高人七级) | 2013-09-11 16:06
0

是不是超时时间太短?

收获园豆:1
angelshelter | 园豆:9887 (大侠五级) | 2013-09-11 17:19
0

底层在发包和接包上跟你在应用程序中处理的是不一样的,不是你应用层次这样处理底层的处理也是这样的,尤其是在大数据包处理情况下,最好分包,然后标识每个包,而且还要注意下是否存在粘包问题

收获园豆:5
andy1987 | 园豆:490 (菜鸟二级) | 2013-09-12 12:09

tcp一般不存在粘包问题,分包发送试过,不知道为什么延时很严重

支持(0) 反对(0) 胡小颖颖 | 园豆:180 (初学一级) | 2013-09-22 19:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册