日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言网络编程:close或者shutdown断开通信连接

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言网络编程:close或者shutdown断开通信连接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

        • 前言
        • close函數介紹
        • shutdown函數介紹

前言

這里在主要通過實例進行描述close函數在網絡編程中的使用
TCP編程模型中客戶端或者服務器只要主動通過close發起斷開連接的請求,則通信連接可以中斷。
可以通過在主進程中抓取通信端的斷開信號,比如SIGINT,在信號處理函數中對該通信文件描述符進行關閉。


close函數介紹

關于close斷開連接的缺點:

  • 會一次性將讀寫文件描述符都關閉
  • 如果多個文件描述符指向同一個連接時(dup函數賦值的文件描述符/或者子進程繼承了父進程的文件描述符),如果僅僅close其中一個文件描述符時,只要其他的fd還是打開狀態,那么連接就不會斷開,直到所有的文件描述符都被close之后

如下close相關代碼

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <errno.h>
#include <pthread.h>typedef struct data {char name[30];unsigned int num;
}Data;void print_err(char *str, int line, int err_no) {printf("%d, %s :%s\n",line,str,strerror(err_no));_exit(-1);
}
int cfd = -1;//線程函數用于循環從cfd描述符中嘗試接收數據
void *receive(void *pth_arg) {int ret = 0;Data stu_data = {0};while(1) {//初始化結構體變量bzero(&stu_data, sizeof(stu_data));ret = recv(cfd, &stu_data, sizeof(stu_data),0);	if (-1 == ret) {print_err("recv failed",__LINE__,errno);}//接收之后需要將網絡端序轉換為主機端序printf("student number = %d student name = %s \n",ntohl(stu_data.num),stu_data.name);}
}/*信號處理函數,當發生SIGINT信號之后關閉通信的文件描述符,并返回成功*/
void sig_fun(int signo) {if (signo == SIGINT) {close(cfd);_exit(0);}
}int main()
{int skfd = -1, ret = -1;skfd = socket(AF_INET, SOCK_STREAM, 0);if ( -1 == skfd) {print_err("socket failed",__LINE__,errno);}struct sockaddr_in addr;addr.sin_family = AF_INET; //設置tcp協議族addr.sin_port = 6789; //設置端口號addr.sin_addr.s_addr = inet_addr("192.168.102.169"); //設置ip地址ret = bind(skfd, (struct sockaddr*)&addr, sizeof(addr));if ( -1 == ret) {print_err("bind failed",__LINE__,errno);}/*將套接字文件描述符從主動轉為被動文件描述符,然后用于被動監聽客戶端的連接*/ret = listen(skfd, 3);if ( -1 == ret ) {print_err("listen failed", __LINE__, errno);}/*被動監聽客戶端發起的tcp連接請求,三次握手后連接建立成功*/struct sockaddr_in caddr = {0};int csize = 0;cfd = accept(skfd, (struct sockaddr*)&caddr, &csize);if (-1 == cfd) {print_err("accept failed", __LINE__, errno);}printf("cport = %d, caddr = %s\n", ntohs(caddr.sin_port),inet_ntoa(caddr.sin_addr));//創建子線程用于接收數據pthread_t id;pthread_create(&id,NULL,receive,NULL);//創建信號處理函數signal(SIGINT,sig_fun);//發送數據結構體定義Data std_data = {0};while (1) {printf("stu name:\n");scanf("%s",std_data.name);printf("stu num:\n");scanf("%d",&std_data.num);//對于int型的需要將主機端序轉換為網絡端序,這里轉成long型。std_data.num = htonl(std_data.num);//將數據std_data強制類型轉換后發送ret = send(cfd, (void *)&std_data,sizeof(std_data),0);if ( -1 == ret) {print_err("accept failed", __LINE__, errno);}	}return 0;
}

shutdown函數介紹

  • 頭文件 #include <sys/socket.h>
  • 函數使用:int shutdown(int sockfd, int how);
  • 功能:可以按照要求關閉連接,且不管有多個文件描述符指向同一個連接,只要調用shutdown去操作了其中某個描述符,連接就會被立即斷開。
  • 返回值:成功:返回0,失敗:返回-1
  • 參數:
    a. sockfd 通信文件描述符,服務器端表示accept函數返回的鏈接后通信描述符
    b. how 如何斷開連接
    SHUT_RD 只斷開讀連接
    SHUT_WR只斷開寫連接
    SHUT_RDWR 讀寫連接都斷開

由shutdown函數的描述中,我們很明顯得能夠看到shutdown相比于close函數的關閉連接的優勢

總結

以上是生活随笔為你收集整理的C语言网络编程:close或者shutdown断开通信连接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。