7 1 優雅斷開套接字

2021-07-26 12:47:59 字數 2885 閱讀 6536

1.使用close,closesocket函式是單方面斷開連線,不夠優雅。呼叫了close意味著完全斷開連線,不能傳送也不能接收資料。

圖中,a傳送完資料後斷開連線,之後主機再也不發接收b的資料,如此不夠優雅。

2.使用shutdown可以關閉其中的乙個流。

#include int shutdown(int sock, int howto);

成功返回0,失敗返回-1

sock:需要斷開的套接字檔案描述符

howto:斷開方式

shut_rd:斷開輸入流

shut_wr:斷開輸出流

shut_rdwr:同時斷開io流

3.基於半關閉的檔案傳輸

file_client.c程式:

#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);

if(sd == -1)

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 )

puts("received file data");

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

fclose(fp);

close(sd);

return 0;

} void error_handling(char *message)

執行結果:

alex@alex-virtual-machine:/extra/tcpip$ ./client 127.0.0.1 9190

received file data

alex@alex-virtual-machine:/extra/tcpip$ ls

a.out client host1 server uecho_server.c

bound_host1.c file_client.c host2 uecho_client.c

bound_host2.c file_server.c receive.dat uecho_con_client.c

alex@alex-virtual-machine:/extra/tcpip$ cat receive.dat

file_server.c程式:

#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);

if(serv_sd == -1)

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]));

if(bind(serv_sd,(struct sockaddr*)&serv_adr,sizeof(serv_adr)) == -1)

listen(serv_sd,5);

clnt_adr_sz = sizeof(clnt_adr);

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

while(1){

read_cnt = fread((void *)buf,1,buf_size,fp);

if(read_cnt執行結果:

alex@alex-virtual-machine:/extra/tcpip$ gcc -o server file_server.c

alex@alex-virtual-machine:/extra/tcpip$ ./server 9190

message from client:thank you

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

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

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

呼叫close函式斷開連線,意味著完全斷開連線,不僅無法傳輸資料,而且也不能接收資料。兩台主機通過套接字建立連線後進入可交換資料的狀態。把建立套接字後可交換資料的狀態看作一種流。為了實現雙向通訊,套接字生成的兩個流。shutdown函式關閉其中乙個流。呼叫上述函式時,第二個引數決定斷開連線的方式 s...

網路程式設計學習筆記(七)優雅的斷開套接字連線

tcp中的斷開連線過程更重要,因為連線過程中一般不會出現大的變數,但斷開過程有可能發生意想不到的情況,因此應準確掌控。只有明白了下面講的半關閉 half close 才能明確斷開過程。linux的close函式和windows的closesocket函式意味著完全斷開連線。完全斷開不僅指無法傳輸資料...