作者larkes (larkes)
看板C_and_CPP
標題[問題]如何讓socket server端收到SIGEPE?
時間Mon Feb 27 10:04:26 2017
開發平台(Platform): (Ex: Win10, Linux, ...)
Server: Linux
Client: Windows
最近寫scoket programming時,
想要複製出讓server端收到SIGEPE的情況
所以在server端, accept對方的連線要求之後,
就寫一個無窮迴圈去發送資料給對方, code的寫法如下:
int idx,result;
for( idx = 0; 1; idx++ )
{
result = send(clientfd, buffer, sizeof(buffer), 0);
printf("errno : %d\n",errno);
}
然後client則是連線成功之後,
呼叫close把socket關掉.Code大約的寫法如下:
SOCKET s;
struct sockaddr_in server;
....(省略).....
if (connect(socketfd , (struct sockaddr *)&server , sizeof(server)) < 0)
{
puts("connect error");
return 1;
}
else
{
close(socketfd);
}
結果,server收到的errno是ECONNRESET,而不是EPIPE
然後程式就停止執行了.
後來我修改client的程式,把close(socketfd)改成shutdown(socketfd, 1),
結果server仍然一樣只有收到ECONNRESET.
然後我改成shutdown(socketfd, 2),
結果仍然一樣只有收到ECONNRESET.
請問...
我該怎麼做,才能讓server收到EPIPE呢?
謝謝賜教!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.11.187
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1488161068.A.29F.html
※ 編輯: larkes (180.177.11.187), 02/27/2017 10:06:38
1F:推 Qbsuran: send/recv失敗後再呼叫一次就有broken pipe了 需要這個 02/27 20:29
2F:→ Qbsuran: 幹嘛? 02/27 20:29