[問題] Socket send 怪現象

看板C_and_CPP作者 (我不知道)時間14年前 (2010/04/19 02:36), 編輯推噓1(1016)
留言17則, 5人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 在寫socket的程式,有問題的部分在client端傳送他table中所有資料, 若傳完會傳一個end當作結束,server端收到end就可以知道結束了。 client: ----------------------------- for(){ strcpy(msg,table[i]); send(msg); } strcpy(msg,"end"); send(msg); ----------------------------- server: ----------------------------- while(1){ recv(msg); printf(msg); if(strcmp(msg,"end")==0) break; } ----------------------------- 但是,程式一直有問題,server就是不知道client已經結束了,找到原因如下, 在最後一個要傳的字串(Client 3),會跟著後面的end一起傳給server 變成(Client 3 HI!\n end),導致我的判斷式出了問題,想請問為什麼會這樣呢?! 是因為他會先放在buffer中一起傳?! ------------------------------------------------ 結果 ------------------------------------------------ client : server: send : 11111111 recv : 11111111 send : 22222222 recv : 22222222 send : 33333333 send : end recv : 33333333 end ------------------------------------------------- (Linux下) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.37.180.44

04/19 02:39, , 1F
我看不懂你的描述耶…或許可以貼程式碼來看看
04/19 02:39, 1F
※ 編輯: po500922 來自: 114.37.180.44 (04/19 02:48)

04/19 03:07, , 2F
如果是tcp的話,其實只要正確shutdown()就好了
04/19 03:07, 2F

04/19 03:11, , 3F
recv()若return 0表示另一端已經正常shutdown
04/19 03:11, 3F

04/19 03:11, , 4F
程式就可以離開迴圈了
04/19 03:11, 4F

04/19 08:21, , 5F
你不能期望你 send 怎麼分割,recv 就會怎麼收到。
04/19 08:21, 5F

04/19 08:22, , 6F
你 send 的東西可能被切成多段收到,也可能被合併後收到。
04/19 08:22, 6F

04/19 11:41, , 7F
設定recv每次能收的最長長度?
04/19 11:41, 7F

04/19 14:10, , 8F
我查了一下~發現return 0代表socket關閉了~
04/19 14:10, 8F

04/19 14:11, , 9F
但是我要做的事一直保持連線說@@ 不希望斷線~
04/19 14:11, 9F

04/19 14:46, , 10F
如果你的msg是固定size的那就設定對應的buffer size
04/19 14:46, 10F

04/19 14:46, , 11F
若是以換行字元切割的話,就把end改成end\n試試
04/19 14:46, 11F

04/19 14:50, , 12F
對於tcp socket而言,send/recv或read/write比較像是
04/19 14:50, 12F

04/19 14:51, , 13F
寫檔案/讀檔案(像用FIFO串起來),所以一個send msg
04/19 14:51, 13F

04/19 14:51, , 14F
並不必然對應到一個recv, 讀的人自己決定要讀多少byte
04/19 14:51, 14F

04/19 14:52, , 15F
寫的人如果寫得比較多,那就是剩下的部份還沒讀到
04/19 14:52, 15F

04/19 14:52, , 16F
如果寫得比較少,recv就會block住
04/19 14:52, 16F

04/19 16:57, , 17F
喔喔喔~!!了解了~感謝樓上!!!
04/19 16:57, 17F
文章代碼(AID): #1Bor55g1 (C_and_CPP)