Re: [問題] winsock recv()
卡住的原因很簡單, 因為沒資料了, 你 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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章