Re: [問題] winsock recv()

看板C_and_CPP (C/C++)作者 (Neo1978)時間14年前 (2012/04/27 23:37), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
卡住的原因很簡單, 因為沒資料了, 你 socket 又是 blocking mode, 所以會卡住. 做法有幾種: [1] 用 poll 或 select 去檢查有沒有資料, 有資料才去讀. [2] socket 改用 nonblocking mode 另外你要看一下 FTP protocol 的文件或 RFC. FTP protocol 要寫個 readline() 來讀, 一次讀一行. ※ 引述《b0690151 (阿伯)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : windows 7 devc++ 4.9.9.2 : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 問題(Question): : 寫一個socket程式連上用filezila server 架的FTP : recv()接收歡迎訊息後資料的迴圈部分會無法跳出 : 預期的正確結果(Expected Output): : recv()接收完資料後跳離迴圈 往下執行 : 程式碼(Code):(請善用置底文網頁, 記得排版) : ...... : connect(sockfd, (SOCKADDR*)&servaddr, sizeof(servaddr)); : do { : rev_len = recv(sockfd, recvbuf, sizeof(recvbuf), 0); : if ( rev_len > 0 ){ : printf("%s",recvbuf); : memset(recvbuf, 0, sizeof(recvbuf));//清空buffer的內容 : }else if ( rev_len == 0 ){ : printf("Connection closed\n"); : break; : }else{ : printf("recv failed: %d\n", WSAGetLastError()); : break; : } : } while( rev_len > 0 ); : printf("Hello??\n"); : ... : 補充說明(Supplement): : 可以很順利地收到歡迎訊息 : 220-FileZilla Server version 0.9.41 beta : 220-written by Tim Kosse (Tim.Kosse@gmx.de) : 220 Please visit http://sourceforge.net/projects/filezilla/ : 就不會再動了... : 試過不用迴圈recv 只收一次 是可以往下執行 : 但訊息會沒收完 而且每次斷的長度也不一樣 : 因為是以前寫的程式(在XP上) 我很確定他曾經可以WORK= = : 有想過用 MSG_WAITALL flag 但編輯器說這個參數undefined : 請版上大大幫忙看哪出了問題 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.38.101.163
文章代碼(AID): #1Fchr3wa (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Fchr3wa (C_and_CPP)