📄 subject_62716.htm
字号:
<p>
序号:62716 发表者:柯阳 发表日期:2003-11-28 11:09:58
<br>主题:探讨,请教在互联网上面的tcp包长度为多少效率最高
<br>内容:小弟在互联网实时发送TCP包,现在包的长度设置为4096Bytes,在接收的时候有时候数据包会乱了。就是服务端没错发4096Bytes的数据,到一定的时间,客户端收下来的4096Bytes数据就不是跟服务端发过来的一样,是否跟掉包有关系?请问要把长度设置为多少比较好。有人说512比较好,有高手告诉一下吗,谢谢。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:zzjhsj 回复日期:2003-11-28 11:14:30
<br>内容:你怎么发的'TCP包'?贴上来大家看看
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:柯阳 回复日期:2003-11-28 11:23:40
<br>内容:我用的是重载端口模式来发的。现在把简要代码发给大家看看。<BR>工作线程的代码为:<BR>DWORD WINAPI WorkThread(LPVOID lpParameter) //工作线程<BR>{<BR> CIocpFrame*pIocpFrame=(CIocpFrame*)lpParameter;<BR> DWORD dwNumBytes,dwRet;<BR> LPPER_HANDLE_DATA PerHandleData;<BR> LPPER_IO_OPERATION_DATA ConText;<BR> BOOL bSuccess = FALSE;<BR> int pos=pIocpFrame->m_pos;<BR> while(1) <BR> {<BR> bSuccess=GetQueuedCompletionStatus(g_hCompPort,<BR> &dwNumBytes, (DWORD*)&PerHandleData, (OVERLAPPED**)&ConText, INFINITE);<BR><BR> if(!bSuccess)<BR> {<BR> //客户端断开连接<BR> if(PerHandleData!=NULL)<BR> { <BR> if(dwNumBytes == 0&&PerHandleData->pIOContext->OperationType==SEND_POST) <BR> pIocpFrame->CloseClient(PerHandleData); <BR> continue;<BR> }<BR> }<BR> <BR> }<BR><BR> if(bSuccess)<BR> if(PerHandleData==NULL&&dwNumBytes==0)<BR> {<BR> //工作线程被通知结束<BR> SetEvent(g_ThreadHandles[pos]);<BR> return 0;<BR> }<BR> if(dwRet==PROCESS_UNRECOGNIZED || dwRet==PROCESS_FAIL)<BR> {<BR> <BR> pIocpFrame->CloseClient(PerHandleData); <BR> continue;<BR> }<BR>// if(dwRet==PROCESS_FAIL)<BR>// return 0;<BR> }//while<BR><BR> return 0;<BR>}<BR><BR>在处理函数的代码如下:<BR>DWORD CIocpFrame::ProcessJob(LPPER_HANDLE_DATA pPerHandleData,LPPER_IO_OPERATION_DATA pConText,int dwNumBytes) //工作函数,根据特定的要求进行修改<BR>{<BR> DWORD dwRet;//Flags;<BR> dwRet=PROCESS_SUCCESS;<BR> DWORD SendBytes;<BR> switch(pConText->OperationType)<BR> {<BR> case SEND_POST: //发送行情库文件数据<BR> {<BR> pConText->nTotalBytes += dwNumBytes; //叠加,总共发送的字节数<BR> if((pConText->nTotalBytes)%(DATABUF) !=0 ) //未发送完成则继续<BR> {<BR> char aa[10];<BR> sprintf(aa,"is: %d",dwNumBytes);<BR> MessageBox(NULL,aa,"bytes",MB_OK);<BR> <BR> pConText->OperationType=SEND_POST;<BR> pConText->nSentBytes+=dwNumBytes; //已经发送的字节数<BR> pConText->DataBuf.buf = pConText->Buffer + pConText->nSentBytes;<BR> pConText->DataBuf.len = DATABUF - pConText->nSentBytes; //余下的字节数 <BR> if (WSASend(pPerHandleData->Socket, &(pConText->DataBuf), 1, &SendBytes, 0,<BR> &(pConText->Overlapped), NULL) == SOCKET_ERROR)<BR> {<BR> if (WSAGetLastError() != ERROR_IO_PENDING)<BR> dwRet=PROCESS_FAIL;<BR> }<BR> return dwRet; //返回<BR> } <BR>}<BR>}else<BR>{<BR>pConText->nSentBytes=0;<BR> pConText->DataBuf.buf = pConText->Buffer;<BR> pConText->DataBuf.len = DATABUF;<BR> if(WSASend(pPerHandleData->Socket,&(pConText->DataBuf),1,&SendBytes,0,&(pConText->Overlapped),NULL) == SOCKET_ERROR)<BR> {<BR> if(WSAGetLastError() != WSA_IO_PENDING)<BR> {<BR> dwRet=PROCESS_FAIL; <BR> }<BR> }<BR><BR> <BR> Sleep(100); //间隔<BR><BR> }<BR> break;<BR> }<BR><BR> return dwRet;<BR>}<BR>break;<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:柯阳 回复日期:2003-11-28 11:25:13
<br>内容:以上是总体框架的代码,去掉大量的细节。<BR>该程序在互联网上大部分时间工作正常,但有时候会乱了包数。在不同的服务器表现也不一样,有的比较稳定,有的就会停了,不继续发送了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:柯阳 回复日期:2003-11-28 11:27:55
<br>内容:代码的DATABUF 代表数据包长度,定义为4096
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:柯阳 回复日期:2003-11-28 11:47:55
<br>内容:在接收端也控制住,保证每次收4096 DATABUF的包<BR>if(BytesTransferred != DATABUF) //等待接收到DATABUF长度的数据包<BR> { <BR> idx = BytesTransferred;<BR> nLeft = DATABUF-BytesTransferred; <BR> while(nLeft >0)<BR> {<BR> dwRead = recv(s_sockfd,&receiveBuffer[idx],nLeft,0);<BR> idx += dwRead;<BR> nLeft -= dwRead;<BR> }<BR> }
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:zzjhsj 回复日期:2003-11-28 11:50:45
<br>内容:我也使用过这个框架,没有出现过这种问题<BR>系统维护每个线程的i/o申请,如果这些申请没有执行前线程停止了,那么这些i/o申请会被系统cancel掉,所以建议把你的所有的I/O申请放到放到一个专门的i/o thread去完成;估计能解决问题<BR><BR>void on_io_request(MSG &msg)<BR>{<BR> //进行IO请求<BR> //READ。。。<BR> //WRITE。。。<BR>}<BR><BR>void iothread(void*)<BR>{<BR> MSG msg;<BR> while(GetMessage(&msg,....))<BR> {<BR> if(msg.message==DOIO)<BR> {<BR> on_io_request(msg)<BR> }<BR> }<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -