呼叫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 需要斷開的...