作者werbnm (懶懶懶)
看板C_and_CPP
標題[問題] socket在第一次recv後 會自動斷線
時間Wed Jun 29 14:56:57 2011
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++ 2010
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
WinSock.h
問題(Question):
小弟要寫一socket連線的client程式,程式碼如下
主要問題是,連線後 第一次會傳一段訊息,接收server回傳的數值,
從其中擷取資料處理再回傳,但第一次send跟recv都沒有問題
可是第二次要send資料,卻發生SOCKET_ERROR 小弟也有嘗試從WSAGetLastError()找答案
錯誤代碼是 10054 reset by peer 但看完還是不太瞭解@@
不知道該如何解決這個問題,麻煩大家
P.S. 我有用telnet 登入過但卻沒有上述所發生情形
程式碼(Code):(請善用置底文網頁, 記得排版)
if (WSAStartup(MAKEWORD(2,2), (LPWSADATA) &wsadata) != 0){
cerr << "echo_srv: WSAStartup() fails";
exit(1);
}
serv.sin_family = AF_INET;
serv.sin_addr.s_addr = inet_addr(SERV_IP);
serv.sin_port = htons(SERV_PORT);
if( (s = socket(AF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR ){
cerr << "Open socket error";
exit(1);
}
if( connect(s, (LPSOCKADDR) &serv, sizeof(serv)) == SOCKET_ERROR){
cerr << "Can't connect to Server\n";
exit(1);
}
do{
/*n = strlen(send_buf);
send_buf[n] = '\0';*/
if( send(s, send_buf, MAXLINE, 0) == SOCKET_ERROR)
cerr << "Send message error\n" << send_buf;
else
cout << "Client send:\n" << send_buf;
if( (n = recv(s, recv_buf, MAXLINE, 0)) == 0){
cerr << "Connection closed\n";
break;
}
else if( n == SOCKET_ERROR){
cerr << "Received error\n" << WSAGetLastError();
break;
}
else{
recv_buf[n] = '\0';
cout << recv_buf;
}
跑完第一次 就中斷了
}while( fgets(send_buf, MAXLINE, stdin) != NULL );
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.164.101.144
※ 編輯: werbnm 來自: 218.164.101.144 (06/29 15:01)
※ 編輯: werbnm 來自: 218.164.101.144 (06/29 15:01)
※ 編輯: werbnm 來自: 218.164.101.144 (06/29 15:02)
推 Dforce:當你while去跟buffer拿資料拿不到就會斷了啊 06/29 16:07
→ Dforce:一般常見的範例都是 while(1) 另外設定跳出迴圈的條件 06/29 16:08
→ werbnm:可是while是我自行輸入的 就算我只按enter還是在迴圈裡阿 06/29 16:21
推 streitleak:把你 while那個條件再想一下 如果沒有資料再buffer會 06/29 17:05
→ streitleak:如何?? 06/29 17:05
→ werbnm:我試過在recv那段加迴圈 可是只要收過第一次 第二次就會進 06/29 17:42
→ werbnm:入 SOCKET_ERROR那段 06/29 17:42
→ werbnm:所以我想說應該跟我的send_buf有沒有東西無關@@ 06/29 17:43
推 Dforce:結果跟while沒關係啊!!!!!!!!!! 06/29 17:54