優雅地斷開套接字連線 套接字半關閉

2021-08-19 18:23:48 字數 2420 閱讀 3640

呼叫close函式斷開連線,意味著完全斷開連線,不僅無法傳輸資料,而且也不能接收資料。

兩台主機通過套接字建立連線後進入可交換資料的狀態。把建立套接字後可交換資料的狀態看作一種流。

為了實現雙向通訊,套接字生成的兩個流。

shutdown函式關閉其中乙個流。

呼叫上述函式時,第二個引數決定斷開連線的方式:

-shut_rd:斷開輸入流

-shut_wr:斷開輸出流

-shut_rdwr:同時斷開i/o流

「一旦客戶連線到伺服器端,伺服器端將約定的檔案傳給客戶端,客戶端收到後傳送字串  『thank you』 給伺服器端。

服務端:

#include#include#include#include#include#include#define buf_size 30

void error_handling(char *message)

int main(int argc, char *argv)

fp = fopen("file_server.c","rb");

serv_sd = socket(pf_inet,sock_stream,0);

memset(&serv_adr,0,sizeof(serv_adr));

serv_adr.sin_family = af_inet;

serv_adr.sin_addr.s_addr = htonl(inaddr_any);

serv_adr.sin_port = htons(atoi(argv[1]));

bind(serv_sd,(struct sockaddr*) &serv_adr,sizeof(serv_adr));

listen(serv_sd,5);

clnt_adr_sz = sizeof(clnt_adr);

clnt_sd = accept(serv_sd,(struct sockaddr*) &clnt_adr, &clnt_adr_sz);

while(1)

write(clnt_sd,buf,buf_size);

} shutdown(clnt_sd,shut_wr); //傳送檔案後針對輸出流進行半關閉。

read(clnt_sd,buf,buf_size); //只關閉了輸出流,依舊可以通過輸入流接收資料。

printf("message from client: %s \n",buf);

fclose(fp);

close(clnt_sd); close(serv_sd);

return 0;

}

客戶端:

#include#include#include#include#include#include#define buf_size 30

void error_handling(char *message)

int main(int argc, char *argv)

fp = fopen("receive.dat","wb"); //建立新檔案儲存伺服器端傳輸的檔案資料

sd = socket(pf_inet,sock_stream,0);

memset(&serv_adr,0,sizeof(serv_adr));

serv_adr.sin_family = af_inet;

serv_adr.sin_addr.s_addr = inet_addr(argv[1]);

serv_adr.sin_port = htons(atoi(argv[2]));

connect(sd,(struct sockaddr*) &serv_adr,sizeof(serv_adr));

while ((read_cnt = read(sd,buf,buf_size)) != 0)

fwrite((void*)buf,1,read_cnt,fp); //將接收的資料寫入到fp指向的檔案receive.dat中

puts("receive file data");

write(sd,"thank you",10);

fclose(fp);

close(sd);

return 0;

}

「優雅」斷開的套接字連線

之前用的方法不夠優雅是因為,我們是呼叫close或closesocket函式單方面斷開連線。1.解釋tcp中 流 的概念。udp中能否形成流?請說明原因。答 兩台主機通過套接字建立連線後進入可交換資料的狀態,又稱 流形成的狀態 也就是把建立套接字後可交換資料的狀態看作是一種流,此處的流可以比作水流,...

7 1 優雅斷開套接字

1.使用close,closesocket函式是單方面斷開連線,不夠優雅。呼叫了close意味著完全斷開連線,不能傳送也不能接收資料。圖中,a傳送完資料後斷開連線,之後主機再也不發接收b的資料,如此不夠優雅。2.使用shutdown可以關閉其中的乙個流。include int shutdown in...

《網路程式設計》 第7章 優雅地斷開套接字連線

思想 只關閉一部分資料交換中使用的流 half close 斷開一部分連線是指,可以傳輸資料但無法接收,或可以接收資料但無法傳輸。顧名思義就是只關閉流的一半。include int shutdown int sock,int howto 功能 關閉一部分資料交換中使用的流。引數 sock 需要斷開的...