急!!!!!用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; }
这是编写的软件的界面:
你只接受了一次,数据可能有无数个包,单你只接受了一次,应该循环判断是否有数据,然后接受,包的大小是TCP控制的,你写入1M TCP会自己给你拆分成包,陆游器一般不会限制
对的,我在接收的时候一直while直到接收到我要的数据就ok了,谢谢回答
公网中某些路由设备是有最大传输包大小限制的。
可能是路由器限制了包的大小
是不是超时时间太短?
底层在发包和接包上跟你在应用程序中处理的是不一样的,不是你应用层次这样处理底层的处理也是这样的,尤其是在大数据包处理情况下,最好分包,然后标识每个包,而且还要注意下是否存在粘包问题
tcp一般不存在粘包问题,分包发送试过,不知道为什么延时很严重