linux網絡編程Internet Socket地址,套接字,和函數

文章內容節選《linux/UNIX 系統網絡編程》

Internet domain socket地址有兩種:IPv4 IPv6

IPv4被存儲在結構體中, 該結構體在 netinet/in.h 中進行定義

cd usr/include/netinet/in.h
struct in_addr
{in_addr_t s_addr;    //32位IPv4地址
}struct sockaddr_in
{sa_family_t     sin_family;  //地址族in_port_t       sin_port;    //16位TCP/UDP端口號struct in_addr  sin_addr;    //32位IP地址unsigned char   __pad[X];     //不用這個
};

sin_family

每種協議族適用的地址族均不同.如IPv4使用4字節地址族,IPv6使用16字節地址族.sa_family是協議簇通常大多用的是都是AF_INET,表示tcpip協議。

用法

struct sockaddr_in server_address;
server_address.sin_family=AF_INET;
AF_INET(又稱 PF_INET)是 IPv4 網絡協議的套接字類型
AF_INET6 則是 IPv6 的

sin_port

以網絡字節序保存16位端口號
為了使網絡程序具有可移植性,使同樣的C代碼在大端和小段計算機上編譯后都能正常運行,可以調用以下庫函數做網絡字節序和主機字節序的轉換。

#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
h表示Host,n表示Network,l表示32為長整數,s表示16位短整數 
如果主機是小端字節序,這些函數將參數做相應的大小端轉換后返回 
如果主機是大端字節序,這些函數不做轉換,將參數直接返回

用法:

int main(int argc, char* argv[])
{
//輸入./a.out 192.168.42.1 9000
addr.sin_port = htons(atoi(argv[2]));
}

sin_addr

用法

server_address.sin_addr.s_addr=inet_addr("127.0.0.1");

以網絡字節序保存32位IP地址信息.

socket套接字:

socket起源于Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,都可以用“打開open –> 讀寫write/read –> 關閉close”模式來操作。Socket就是該模式的一個實現,
socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉).
說白了Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。

套接字描述符

其實就是一個整數,我們最熟悉的句柄是0、1、2三個,0是標準輸入,1是標準輸出,2是標準錯誤輸出。0、1、2是整數表示的,對應的FILE *結構的表示就是stdin、stdout、stderr

文件描述符對象FILE *
0標準輸入Standard Inputstdin
1標準輸出Standard Outputstdout
2標準錯誤Standard Errorstderr

基于TCP/IP的服務器端/客戶端函數調用關系

這里寫圖片描述

TCP客戶端的默認函數調用順序

  • socket()創建套接字
  • connect()請求連接
  • read()/write()交換數據
  • close()斷開連接

TCP服務器端的默認函數調用順序

  • socket()創建套接字
  • bind()分配套接字地址
  • listen()等待連接請求狀態
  • accept()允許連接
  • read()/write()數據交換
  • close()斷開連接

函數

創建socket套接字(TCP/UDP,客戶端+服務器)

int socket(int domain,int type,int protocol);

綁定端口號(TCP/UDP,服務器)

int bind(int socket,const struct sockaddr *address,socklen_t address_len);

開始監聽socket(TCP,服務器)

int listen(int socket,int backlog);

接收請求(TCP,服務器)

int accept(int socket,struct sockaddr *address,socklen_t *address_len);

建立連接(TCP,客戶端)

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382669.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談socket網絡編程函數參數(一)

socket函數解析 概念: 每個進程的進程空間里都有一個socket描述符表。套接字描述符表屬于一個進程&#xff0c;而socket地址結構位于操作系統的內核緩沖。 函數原型 #include <sys/socket.h>int socket(int domain, int type, int protocol);函數參數 family參數 默…

C++ const 與 extern

C語言中&#xff0c; const修飾的全局變量是外部鏈接屬性&#xff0c;比如在 a.c文件中有 const int m_a 10; 在b.c中想用這個全局變量&#xff0c; 在b.c中這樣 extern const int m_a; 就可以使用a.c中的m_a C 語言中&#xff0c; const修飾的全局變量是內部鏈接屬性&#x…

淺談socket網絡編程函數參數(二)

bind()函數 bind()函數把一個地址族中的特定地址賦給socket。 例如對應AF_INET、AF_INET6就是把一個ipv4或ipv6地址和端口號組合賦給socket。 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);參數解析 sockfd&#xff1a;即socket描述字&#xff0c…

對引用的理解3

對數組的引用&#xff0c; 相關語法 int main() { //引用于法// type &引用名 原名//數組的引用//1) 先定義一個數組int array[10];int (&refArray)[10] array;for (int i 0; i < 10; i) {array[i] i;}for (int i 0; i < 10; i) {cout << refArray[i…

運算符與,|與||的區別

|和&是位運算&#xff0c;運算結果是二進制數。 &&,||是邏輯運算&#xff0c;運算結果是真&#xff0c;或者假。 6&3110&0110102 6|3110|0111117&, &&和||計算時注意&#xff0c; 題目&#xff1a;條件1&&條件2&&條件3 如…

C++ 對引用的理解4

引用的注意事項 // 引用注意事項&#xff0c; 不能返回局部變量的引用 int & test3() { //因為局部變量出了函數體外 就會被銷毀int a 10;return a; }// 引用注意事項&#xff0c; 返回值如果是引用&#xff0c; 那么函數可以作為左值進行運算 int & test4() {static…

關于argc和argv的輸出

代碼 #include <stdio.h>int main(int argc ,char * argv[]) {printf("argc ->%d\n",argc);for(int i 0; i < argc;i){printf("%s\n",argv[i]);}return 0; } 輸出結果 [koulocalhost 8_6網絡計算器]$ ./a.out 192.168.1.1 9000 argc ->…

C++ 對引用的理解5

常量引用 int main() { // int &m 10; // 錯誤&#xff0c; 引用必須引一塊合法的內存空間&#xff08;什么是合法的內存空間&#xff0c; 這個10在程序中有內存嗎&#xff1f;&#xff09;const int &m 10; //加入const后&#xff0c;語法就通過了&#xff0c;編譯…

為什么計算機起始時間是1970年1月1日

1969年8月&#xff0c;貝爾實驗室的程序員肯湯普遜利用妻兒離開一個月的機會&#xff0c;開始著手創造一個全新的革命性的操作系統&#xff0c;他使用B編譯語言在老舊的PDP-7機器上開發出了Unix的一個版本。隨后&#xff0c;湯普遜和同事丹尼斯里奇改進了B語言&#xff0c;開發…

C++ 使用extern C簡單使用

先說一下函數重載&#xff0c; C 之所以會進行函數重載&#xff0c; 是因為對函數名進行二次修飾(重新命名) 在C文件中寫好的程序&#xff0c; C引入過來&#xff0c;卻沒法使用提示 無法連接的外部符號&#xff0c;那是因為C按照C的函數命名機制來尋找函數的實現. 第一種情況&…

IP數據包格式netinet/ip.h

轉載地址https://www.cnblogs.com/embedded-linux/p/4986449.html 頭文件netinet/ip.h中定義ip&#xff1a; struct ip{#if __BYTE_ORDER __LITTLE_ENDIANunsigned int ip_hl:4; /* header length */unsigned int ip_v:4; /* version */#endif#if __BYTE_ORDER __BIG_ENDIA…

c 結構體的簡單封裝1

先看C語言的 借助結構體 struct Person{char name[64];int age; }; void PersonEat(struct Person *p) {printf("%s在吃飯", p->name); } void test() {struct Person p;strcpy(p.name, "隔壁老王");PersonEat(&p); }

C++ 構造函數分類以及調用

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;//1、分類 //按照參數進行分類 有參構造函數 無參構造函數&#xff08;默認構造函數&#xff09; //按照類型進行分類 普通構造函數 拷貝構造函數 class Person { public://默認構造Per…

內存泄漏Valgrind

#內存泄漏Valgrind valgrind --toolmemcheck --leak-checkfull [Your progame option]; https://cloud.tencent.com/developer/article/1006199 https://www.cnblogs.com/zhoudayang/p/6110360.html https://www.cnblogs.com/napoleon_liu/articles/2001802.html https://…

C++ 拷貝構造函數的使用場景

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Person { public:Person(){cout << "默認構造函數調用" << endl;}Person(int a){m_Age a;cout << "有參構造函數調用" << endl;}Person(co…

大數據多路歸并算法

https://blog.csdn.net/wongson/article/details/49209903 先把一個大的數據分成若干小份&#xff0c;然后對這些小份文件進行排序。排序好之后對這些小份文件進行如下處理。 我們舉個簡單的例子&#xff1a; 文件1&#xff1a;3,6,9 文件2&#xff1a;2,4,8 文件3&#xff…

C++ 深淺拷貝 01

1.C中成員對象如果指向了堆內存的空間&#xff0c;如果這時候使用了系統提供的拷貝構造函數&#xff08;默認淺拷貝&#xff09;&#xff0c;會造成內存重復釋放的問題&#xff0c;導致程序down掉&#xff0c;解決辦法修改默認的拷貝構造函數&#xff0c;也給新的對象需要堆內存…

文件描述符和fcntl及阻塞非阻塞

Linux 文件描述符和重定向 https://www.cnblogs.com/chenmh/p/5382044.html fcntl函數的用法總結 https://www.cnblogs.com/zxc2man/p/7649240.html 簡述linux同步與異步、阻塞與非阻塞概念以及五種IO模型 https://www.cnblogs.com/chaser24/p/6112071.html

C++拷貝構造函數的調用時機

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Person { public:Person(){cout << "默認構造函數調用" << endl;}Person(int a){m_Age a;cout << "有參構造函數調用" << endl;}Person(co…