關於SOCKET程式設計二三事 入門通俗版 2

2021-10-24 18:38:25 字數 3057 閱讀 7688

電腦10分鐘之內給我整了兩次藍屏,修理了一下後,不知道好了木,這玩意真的靠玄學,嘚嘚嘚。

繼續回來,上次講到了連線,socket連線功能,個人感覺直接用bind完事,connect函式大同小異,沒啥大的區別。ok,先隆重的介紹一下bind函式(此篇文章講的是連線ipv4網路)

int bind(socket sock, const struct sockaddr *addr, int addrlen);
sock 為 socket 檔案描述符,addr 為 sockaddr 結構體變數的指標,addrlen 為 addr 變數的大小,可由 sizeof() 計算得出,下面講一下本渣的心路歷程。

第乙個引數,就是上篇文章創造的socket變數,此處就不在贅述,第二個和第三個乍一看還蠻麻煩的,為了你們,我硬著頭看一下。。

第二個引數,有struct,是結構體型別,那這個結構體自然是用。。。沒錯,不是sockaddr,是sockaddr_in來寫的,在最後用sockaddr型別強制轉換,原因稍後會講,先講一下這個喧賓奪主的傢伙(這東西自己帶有的,不需要單獨再定義哈)。

struct sockaddr_in;
我覺著原因已經很明顯了,真相只有乙個,這哥們太全面了。作為連線函式,你要確定連線的物件,位址埠啥的,這哥們都有,該有的功能都有,還有誰!!然後此處應該有對比,來一手兩個函式功能的對比

表現ko。sockaddr_in上位之後,我們來看一下他的具體操作:

//建立sockaddr_in結構體變數

struct sockaddr_in serv_addr;

memset(&serv_addr, 0, sizeof(serv_addr)); //每個位元組都用0填充

serv_addr.sin_family = af_inet; //使用ipv4位址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具體的ip位址

serv_addr.sin_port = htons(1234); //埠

此處的意思為將建立的socket與ip位址 127.0.0.1(自身)、埠 1234 繫結,至於第一句的填充,個人認為是乙個類似於定義變數,初始化的意思,若有會的大佬,感謝指正。

然後此時又有人可能會問sin_addr咋後面還有元素,據查詢,sockaddr_in第三個元素在標頭檔案 中定義,等價於 unsigned long,長度為4個位元組,也就是這句話等價為unsigned long a=inet_addr("127.0.0.1");

終於結束了,第三個引數隨著第二個引數結果的出現,直接投降了,所以繫結語句為:

bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
來個完整的**

//建立socket

int serv_sock = socket(af_inet, sock_stream, ipproto_tcp);

//建立sockaddr_in結構體變數

struct sockaddr_in serv_addr;

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

serv_addr.sin_family = af_inet; //使用ipv4位址

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具體的ip位址

serv_addr.sin_port = htons(1234); //埠

//將套接字和ip、埠繫結

bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

終於繫結cp了,下一步他咋工作呢?眾所周知,人的活動只有兩種,睡覺和工作,巧的是,這和socket生活作息一模一樣。

socket的睡覺函式是listen(),定義函式為int listen(socket sock, int backlog);   就兩個引數,乙個是睡覺的物件,socket,另乙個則是請求佇列的最大長度,也就是叫醒這個socket需要多少請求資料,這個可以自己設定,然後系統也給你發了乙個,somaxconn,也就是系統給你設定了。

socket的工作函式是accept(),定義函式為socket accept(socket sock, struct sockaddr *addr, int *addrlen); 第乙個引數是工作的物件,第二個是包含客戶端資訊的結構體,第三個是他的長度。然後accept() 會阻塞程式執行(後面**不能被執行),直到有新的請求到來,畢竟人家正幹著活,你想幹啥!

我覺著,有同學一直問,都說socket是通訊網路必備,我咋沒看到通訊呢?此處邀請壓軸嘉賓出場,send()函式和recv()函式,你向伺服器傳送資料,要用到send(),國際慣例,先看定義,

int send(socket sock, const char *buf, int len, int flags);
第乙個自然是你socket的變數名,話說感覺似乎啥函式都要用到這個,否則沒法宣告自己的身份。第二個是要傳送的資料的緩衝區位址,len 為要傳送的資料的位元組數,flags 為傳送資料時的選項。此處稍微解釋一下,無論是輸入資料,還是輸出資料,資料並不是立刻就能到達目的地,而是先進入輸入緩衝區或者輸出緩衝區,組織好語言,化完妝後再到目的點,然後這個緩衝區位址應該是自己定義的(我猜的,期待大佬糾正),第三個很好解釋,資料麼。第四個,嗯,我們目前一般用不到,當路人處理。

結束上個函式的講解後,有乙個好訊息和乙個壞訊息。壞訊息是還有個recv()函式沒出場,好訊息是他的出場形式和send()幾乎一模一樣,先把定義擺出

int recv(socket sock, char *buf, int len, int flags);
今天學習任務到此為止了,感謝大家陪伴,自己可能還學不了這麼多,明天再見~~~~~~

關於SOCKET程式設計二三事 入門通俗版

根據老闆的需求,我要學習關於通訊網路程式設計部分內容。然後,自然而然,我就被主動提示學習socket了。好吧,那我們愉快的開始一段新的旅程。本渣在之前從未了解過socket,8說了,一起進步一起渣。然後我也忘記 來的這圖了,若有侵權,必刪好吧,先在這感謝了。本渣目前只用windows,用linux的...

Python入門二三事

關於python的讚譽比比皆是,不再贅述。csdn的賴永浩 有一陣子的部落格簽名很是精闢,引用一下 life is short,you need python.下文中,如果提到python,指的是這一種語言 如果寫作python,則是指python語言的解釋程式。1.選擇版本 python目前存在乙...

keilC程式設計錯誤二三事

問題一 error c132 not in formal parameter list 錯誤分析 原來是在h檔案 函式宣告 void init adc 時漏了乙個小小的 分號。就錯了很多地方。解決方法 記得在標頭檔案宣告時要加上 問題二 error c100 unprintable characte...