亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ POSIX API超詳細分析

 更新時間:2022年11月16日 13:59:25   作者:叫我莫言鴨  
這篇文章主要介紹了C++ POSIXAPI的使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧

1.網絡通信

1.消息傳遞(管道、FIFO、消息隊列)

2.同步(互斥量、條件變量、讀寫鎖、文件和寫記錄鎖、信號量)

3.共享內存(匿名的和具名的)

使用TCP/IP協議 通過socket完成

2.posix API

目的:實現不同系統上的源代碼的可移植性。

舉例:linux和windows都要實現基本的posix標準,linux把fork函數封裝成posix_fork(隨便說的),windows把creatprocess函數也封裝成posix_fork,都聲明在unistd.h里。這樣,程序員編寫普通應用時候,只用包含unistd.h,調用

3.POSIX網絡API

4.函數內部過程解析

4.1 socket套接字創(chuàng)建

int socket(int domain, int type, int protocol);
//參數分別是地址族、 套接字類型和協議
//AF_INET  SOCK_STREAM 可默認為0
//IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等

4.2 bind 綁定端口

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd:即socket描述字

addr:一個const struct sockaddr *指針,指向要綁定給sockfd的協議地址。

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 0.0.0.0 監(jiān)聽時,監(jiān)聽所有的地址
server_addr.sin_port = htons(port);
struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET  協議族*/
    in_port_t      sin_port;   /* port in network byte order  端口號*/
    struct in_addr sin_addr;   /* internet address  IP地址*/
};
/* Internet address. */
struct in_addr {
    uint32_t       s_addr;     /* address in network byte order */
};

通常服務器在啟動的時候都會綁定一個眾所周知的地址(如ip地址+端口號),用于提供服務,客戶就可以通過它來接連服務器;而客戶端就不用指定,有系統自動分配一個端口號和自身的ip地址組合。這就是為什么通常服務器端在listen之前會調用bind(),而客戶端就不會調用,而是在connect()時由系統隨機生成一個。但是我認為客戶端也可以綁定。

4.3 網絡字節(jié)序和主機字節(jié)序

小端:小字節(jié)放前面,大字節(jié)放后面
大端:大字節(jié)放前面,小字節(jié)放后面
轉換端口
uint16_t htons(uint16_t hostshort); //主機字節(jié)序->網絡字節(jié)序
uint16_t ntohs(uint16_t netshort); //網絡字節(jié)序->主機字節(jié)序
轉IP
 htonl(uint32_t hostlong);//主機字節(jié)序->網絡字節(jié)序
 ntohl(uint32_t netlong);//網絡字節(jié)序->主機字節(jié)序

4.4 listen監(jiān)聽fd

int listen(fd,size) // 無錯返回0,錯誤返回-1

服務端調用listen()后,開始監(jiān)聽網絡上發(fā)送給socket的連接請求。

也就是說,開始接收請求了。

4.5 connect發(fā)起連接請求

int connect(int sockfd, 
const struct sockaddr *serv_addr,
int socklen_t addrlen);

4.6 accept()接收請求建立連接

accept()函數只做兩件事,將連接請求從全連接隊列中取出,給該連接分配一個fd并返回。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

4.7 消息的發(fā)送和接收

read()/write()

recv()/send()

readv()/writev()

recvmsg()/sendmsg()

recvfrom()/sendto()

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count); // 目的fd 消息 消息長度
ssize_t write(int fd, const void *buf, size_t count);
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
              const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

4.8 粘包問題

2個數據包同時被提出,但是由于數據是在一起的,沒有辦法分離

解決方法:

  • 在包頭添加一個數據包長度的字段,標明長度來確定數據包
  • 在包結束后添加分割符,這里注意分割符要選擇不經常使用的

注意: 1優(yōu)于2,因為,添加分割符,需要遍歷整個消息來找到分隔符,這樣大大影響效率,但是2可以結合1使用。

4.9 close

#include <unistd.h>
int close(int fd);

close操作只是使相應socket描述字的引用計數-1,只有當引用計數為0的時候,才會觸發(fā)TCP客戶端向服務器發(fā)送終止連接請求。

過程分析

1.正常情況下一方調用close情況如下圖:

2.當雙方同時調用close,如下圖:

當同時發(fā)送close時,兩邊同時發(fā)送fin 和ack 這時候調用time_wait等待消息發(fā)送完畢。

Fin_wait_1作用?

等待對方回復,超時自動重發(fā)fin。

Fin_wait_2作用?

等待對方業(yè)務邏輯處理后,發(fā)送fin包。這里有可能出現死等待的情況服務器如果出現大量的Fin_wait_2可能需要考慮是不是沒有close,或者close之前做了耗時操作。time_wait 作用?

防止最后一個ACK沒有順利到達對方,超時重新發(fā)送ack。time_wait時常一般是120s可以修改。

服務器掉線重啟出現端口被占用怎么辦?

其實主要是由于還處于time_wait狀態(tài),端口并沒有真正釋放。這時候可以設置SO_REUSEADDR屬性,保證掉線能馬上重連。

到此這篇關于C++ POSIXAPI超詳細分析的文章就介紹到這了,更多相關C++ POSIXAPI內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++中的常對象與常對象成員詳解

    C++中的常對象與常對象成員詳解

    常成員函數可以訪問常對象中的數據成員,但仍然不允許修改常對象中數據成員的值。有時在編程時有要求,一定要修改常對象成員中的某個數據成員的值(例如類中有一個用于計數的變量count,其值應當不能變化)
    2013-10-10
  • C++實現歸并排序

    C++實現歸并排序

    這篇文章主要為大家詳細介紹了C++實現歸并排序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 基于C語言實現五子棋游戲

    基于C語言實現五子棋游戲

    這篇文章主要為大家詳細介紹了基于C語言實現五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語言實現圖書管理系統課程設計

    C語言實現圖書管理系統課程設計

    這篇文章主要為大家詳細介紹了C語言實現圖書管理系統課程設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++常見錯誤中英文對照表

    C++常見錯誤中英文對照表

    對于剛學編程,剛接觸C++的新手來說,編譯運行報錯是最頭疼的一件事,爆出一堆英文,英語差一點的又不知道什么意思,所以也不知道如何去改,在此,我給大家傳一份常見錯誤中英文對照表及簡單解釋,希望可以幫到大家
    2016-05-05
  • 用C語言實現井字棋游戲代碼

    用C語言實現井字棋游戲代碼

    大家好,本篇文章主要講的是用C語言實現井字棋游戲代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++標準模板庫string類的介紹與使用講解

    C++標準模板庫string類的介紹與使用講解

    今天小編就為大家分享一篇關于C++標準模板庫string類的介紹與使用講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • 詳解C語言面向對象編程中的封裝

    詳解C語言面向對象編程中的封裝

    這篇文章主要為大家詳細介紹了C語言面向對象編程中的封裝,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++數組模擬之單鏈表與雙鏈表和棧和隊列的實現過程

    C++數組模擬之單鏈表與雙鏈表和棧和隊列的實現過程

    這篇文章主要介紹了C++數組模擬之單鏈表與雙鏈表和棧和隊列的實現過程,了解內部原理是為了幫助我們做擴展,同時也是驗證了一個人的學習能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的,跟隨下文來具體了解吧
    2023-02-02
  • 詳解C++ thread用法總結

    詳解C++ thread用法總結

    這篇文章主要介紹了詳解C++ thread用法總結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07

最新評論