?? subject_27650.htm
字號:
<p>
序號:27650 發表者:嵇山 發表日期:2003-01-14 11:12:06
<br>主題:我想請問關于recv()的問題
<br>內容:我用recv()去收一個socket的內容,但debug時,與我用其他工具抓來的包<BR>相比較,總是發現前面多了四個字節.<BR>大家有沒有碰到過這樣的事情,折同兩天了,依然不能解決.<BR><BR> Packet = (uchar *)(malloc( 1208*sizeof(uchar)));<BR> memset(Packet,0,1208);<BR><BR>i = recv(Sock,(char far *)Packet,1208,0);<BR> printf("i=%d ",i);<BR><BR>返回的i值是對的,但就是packet的前4個字節與抓來的包的內容不隊,<BR><BR>實際上我程序抓來的包從第5個字節開始與用工具抓的包第一個字節相同,后面的都相同,實際上就是前面多出了4個字節.<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>回復者:mm2003 回復日期:2003-01-14 11:27:02
<br>內容:接受時為什么要強制設為far指針,如果用far指針不應用MALLOC(),建議你用NEW開辟空間
<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-01-14 13:48:59
<br>內容:謝謝mm2003<BR><BR>剛才照你的方法改了一下,但結果還是和原來的一樣,多了4個字節.<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>
回復者:mm2003 回復日期:2003-01-14 14:28:40
<br>內容:還有一點疑問,你開辟的是一個unsigned char的指針,接受時怎么又換成char,到底發送方發的是什么類型呢?
<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-01-14 15:10:19
<br>內容:因為recv的參數職能是char *的,<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-01-14 15:19:01
<br>內容:mm2003:<BR>謝謝你<BR>剛才照你說的改了一下,但還是不行,<BR>真的不知道除出了什么問題<BR><BR>同一個程序,你用抓包的軟件抓來的,和自己程序里面的就是不一樣<BR>memory里packet的內容與抓包的內容不一樣.
<br>
<a href="javascript:history.go(-1)">返回上頁</a><br><a href=http://www.copathway.com/cndevforum/>訪問論壇</a></p></blockquote>
<hr size=1>
<blockquote><p>
回復者:mm2003 回復日期:2003-01-14 16:10:31
<br>內容:我懷疑那4個字節是OUT OF BAND數據,你用RECV()最后參數用MSG_PEEK試一試
<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-01-14 16:23:34
<br>內容:已經用它是過了,但是不行,我用的<BR>i = recv(Sock,(char far *)Packet,1208,0);<BR>這樣不行,<BR>后來改成i = recv(Sock,(char far *)Packet,1208,MSG_PEEK);<BR>還是不行,<BR>再看msdn,我看標準參數是(SOCKET ,char FAR *,int,int)<BR>于是我改成i = recv(Sock,(char FAR *)Packet,1208,0);<BR>還是不行,<BR>還有,malloc不能和far 一起用嗎?<BR><BR>我沒有用bind函數,<BR>是否一定要用bind,<BR>我只用了connect.<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-01-14 16:28:56
<br>內容:一小段還算完整的程序:<BR><BR>SOCKET hNewSock;<BR>char username[256];<BR>hNewSock = accept(_this->m_sock, NULL, NULL);<BR>// make it blocking<BR>WSAAsyncSelect(hNewSock, hwnd, 0, 0);<BR>u_long blk = 0;<BR>int res = ioctlsocket(hNewSock, FIONBIO, &blk);<BR>assert(res == 0);<BR>CloseScreenSaver();<BR>// Se if the server's sending a user name<BR>int namelen = recv(hNewSock, username, 250, 0);<BR>if (namelen >= 0) <BR>username[namelen] = 0;<BR>log.Print(2, _T("Flash for '%s'\n"), username);<BR>closesocket(hNewSock);<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>
回復者:mm2003 回復日期:2003-01-14 16:32:43
<br>內容:我記得far指針是和farmalloc()聯用的,很久不用了,另外不知你用的是TCP方式還是UDP方式,TCP方式bind()一定要用,UDP方式我試過好像不用bind()也可以
<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-01-14 16:35:37
<br>內容:也就是說<BR>char Packet[1028];<BR>i = recv(SockPacket,1208,0);<BR>試試<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-01-14 16:43:04
<br>內容:mm2003:<BR>謝謝,<BR>我是用建立在tcp上的smb,但我只寫client端的程序,bind()是不是用在服務器端的,client是否必要.
<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-01-14 16:45:04
<br>內容:紫云:<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>
回復者:mm2003 回復日期:2003-01-14 16:49:26
<br>內容:如果是TCP,client和server兩端都需要用bind()
<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-01-14 17:08:14
<br>內容:sorry, buffer忘了<BR><BR>i = recv(SockPacket,Packet,1208,0);<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-01-14 17:13:03
<br>內容:什么呀,逗號忘了<BR><BR>i = recv(Sock,Packet,1208,0);<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-01-14 17:17:05
<br>內容:呵呵,剛才把bind加上去了<BR>哎,還是老樣子<BR>不過,recv返回得值即i有時候是比抓來的多4,有時候就是4,<BR>執行第一次 得時候,i=117,(比抓來的多4)<BR>第2次,i=4;<BR>然后,有時候是4,有時候是117,<BR>我們老師說可能是一開始就有4個byte被抓進了隊列,然后,后面一直沒有被清掉,所以才多4byte.<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>
回復者:mm2003 回復日期:2003-01-15 09:50:07
<br>內容:不知你設置的什么方式,是BLOCKING還是UNBLOCKING,這個RECV()是寫在接受線程中的還是你手動調用的
<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-01-15 11:01:16
<br>內容:我用的select,unblocking,沒有用到線程<BR>我都快瘋了,現在我要得到recv()返回的數據,我只好在每個后面都加上4,<BR><BR>如果你有空,幫我看看<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>
回復者:mm2003 回復日期:2003-01-15 11:48:12
<br>內容:簡單讀了一下你的程序,我的兩個意見<BR>1.改用BLOCKING模式試一下,如果用UNBLOCKING方式加長等待時間或做個循環判斷返回的字節數是否正確,正確再退出<BR>2.bind()函數應該在connect()之前用<BR>不知正確否,希望對你有幫助。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -