📄 subject_38672.htm
字号:
<p>
序号:38672 发表者:xiongli 发表日期:2003-05-05 11:55:55
<br>主题:我的WSARecvFrom怎么老是错阿!
<br>内容:int WSARecvFrom(<BR> SOCKET s,<BR> LPWSABUF lpBuffers,<BR> DWORD dwBufferCount,<BR> LPDWORD lpNumberOfBytesRecvd,<BR> LPDWORD lpFlags,<BR> struct sockaddr FAR *lpFrom,<BR> LPINT lpFromlen,<BR> LPWSAOVERLAPPED lpOverlapped,<BR> LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine<BR>);<BR><BR><BR>recvfrom可以一次接收一个数据包,如果队列里面没有数据包,他就会挂起<BR><BR>WSARecvFrom可以把数据包放到一个WSABUF数组里面.但是我有几点不明白的地方:<BR>1,书上上面说WSARecvFrom可以实现scatter-gather I/O,我想也就是调用一次就把尽量把对列里面的数据包放到WSABUF数组里面.既然是放到WSABUF数组里面,那么是一个WSABUF数组的原素对应一个数据包呢还是连贯地存储到WSABUF数组里面?<BR><BR>2,如果调用一次就把尽量把对列里面的数据包放到WSABUF数组里面,当不同的client给我发过来数据包,那么一个lpFrom如何能够辨别它们呢?<BR><BR>所以我猜想应该是没调用一次WSARecvFrom就把某一个client发过来的数据包尽可能地填充满lpBuffers,而且是一个数据包对应一个lpBuffers的原素.<BR>如果有多个client发数据包过来,那么就需要调用WSARecvFrom多次.<BR><BR>然后我想写程序来证实这个东西,我这样调用:<BR><BR><BR>WSADATA wsd;<BR> SOCKET s;<BR> char *recvbuf = NULL;<BR> int ret,<BR> i;<BR> DWORD dwSenderSize,count;<BR> SOCKADDR_IN sender,<BR> local;<BR> WSABUF mybuf[1];<BR> char str[100];<BR> mybuf[0].buf=str;<BR> mybuf[0].len=100;<BR><BR>//....<BR>//初始化socket,bind完成后<BR>ret = WSARecvFrom(s,mybuf, 1,&count,0,(SOCKADDR *)&sender, &dwSenderSize,0,0);<BR><BR> if (ret == SOCKET_ERROR)<BR> {<BR> printf("recvfrom() failed; %d\n", WSAGetLastError());<BR> break;<BR> }<BR><BR>结果 WSARecvFrom老是出错,错误是WSAEFAULT<BR>msdn的解释是:<BR>The lpBuffers, lpFlags, lpFrom, lpNumberOfBytesRecvd, lpFromlen, lpOverlapped, or lpCompletionRoutine parameter is not totally contained in a valid part of the user address space: the lpFrom buffer was too small to accommodate the peer address.<BR><BR>检查来检查去都不知道为什么<BR>:(
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:Neil Gan 回复日期:2003-05-05 12:28:55
<br>内容:I never used WSARecvFrom. I only use recvfrom.<BR><BR>1.lpFrom is a buffer, so it can contain multiple addresses.<BR>2.Init dwSenderSize: dwSenderSize=1
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:xiongli 回复日期:2003-05-05 12:35:03
<br>内容:不对阿<BR>我用dwSenderSize=1还是不正确(原来是dwSenderSize = sizeof(sender);)<BR><BR>如果用<BR>dwSenderSize = sizeof(sender);<BR> ret = recvfrom(s, recvbuf, dwLength, 0, <BR> (SOCKADDR *)&sender, &dwSenderSize);<BR>就是正确的<BR><BR>这是msdn对recvfrom里面的fromlen的解释,他应该是sizeof(sender)<BR>fromlen <BR>[in, out] Optional pointer to the size of the from buffer. <BR><BR>这是msdn对WSARecvFrom的解释,看得出两个是一样的!<BR>lpFromlen <BR>[in, out] Pointer to the size of the from buffer, required only if lpFrom is specified. <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>
回复者:Neil Gan 回复日期:2003-05-05 12:35:26
<br>内容:You are very quick. Have you trid my answer? I am not sure of it.<BR><BR>And, because lpFrom is a buffer, I guess that every package will be put in a recv buf, and its sender address will be put in lpFrom. Please tell me whether it is correct.<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>
回复者:xiongli 回复日期:2003-05-05 12:35:38
<br>内容:我现在是一看到WSA开头的就头痛.......
<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 + -