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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

發布時間:2023/12/20 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

BSD Socket網絡編程API

創建socket對象

int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符,失敗返回-1.

參數1:socket對象使用的地址簇或協議簇

? ? ? ?

  ?常用的有PF_LOCAL(本機通信)、PF_INET(IPv4協議簇)、PF_INET6(IPv6協議簇)

參數2:socket的類型。共有六種。常見有:面向連接的數據流方式;面向無連接的數據報方式

參數3:標識采用哪一種協議,0表示默認。

?

綁定本地IP地址與端口

int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) :成功返回0,失敗返回-1

參數1:用于綁定本地IP的文件描述符

參數2:指向sockaddr結構的指針,標識本地地址信息。如果是IP地址,要求IP地址必須為本機IP地址,端口必須為一個未占用的本地端口。

sockaddr數據結構定義如下:

#define __CONST_SOCKADDR_ARG __const struct sockaddr * struct sockaddr {sa_family_t sa_family; //協議簇char sa_data[14]; //協議地址 };

sockaddr只提供地址類型規范,根據不同,需要選用不同的類型。

  如果是UNIX套接字,即本機通信的套接字,socket需要與本地socket文件綁定。

#define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family //##為宏連接 struct sockaddr_un {_SOCKADDR_COMMON (sun_); //協議AF_UNIXchar sun_path[108]; //文件路徑名 不能與系統文件名沖突 使用完后刪除 };

  IPV4網絡通信,sockaddr的結構體應選用下面定義:

struct sockaddr_in {__SOCKADDR_COMMON(sin_); //協議AF_INETin_port_t sin_port; //端口號struct in_addr sin_addr; //IP地址unsigned char sin_zero[sizeof(struct sockaddr) - _SOCKADDR_COMMON_SIZE - sizeof(in_port_t) - sizeof(struct in_addr)]; //預留位 以適應struct sockaddr位 };

    其中IP地址的結構體定義為:

struct in_addr{__u32 s_addr; };

參數3:綁定的地址長度,一般sizeof求得。因為有多種地址類型。

?

監聽網絡

int listen (int __fd, int __n) ?成功返回0,失敗返回-1。

參數1:綁定了IP及端口的socket文件描述符

參數2:請求排隊的最大長度。

?

客戶端發起連接

int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) 成功返回0,失敗返回-1.

參數1:socket文件描述符

參數2:連接的目的主機地址(包括IP地址和端口)

參數3:該地址長度

?

服務器接收連接

int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len) ?在監聽到客戶端連接請求時通過該函數接收,未監聽到時阻塞。成功返回新的文件描述符,失敗返回-1.

參數1:socket文件描述符

參數2:stuct sockaddr類型的地址空間首地址

參數3:該段地址空間的長度

服務器通過源IP、源端口、目的IP、目的端口來區分某個連接

?

讀/寫socket對象:默認以阻塞方式進行

ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur ?讀文件內容

ssize_t write (int __fd, __const void *__buf, size_t __n) __wur 寫文件內容

?

TCP發送/接收數據

ssize_t send (int __fd, __const void *__buf, size_t __n, int __flags) :發送數據。當第4個參數為0時與調用write一樣。成功返回發送數據大小,失敗返回-1.

ssize_t recv (int __fd, void *__buf, size_t __n, int __flags) :接收數據。?成功返回接收數據大小,失敗返回-1.

參數1:目標socket對象

參數2:欲發送/接收的數據位置

參數3:欲發送/接收的數據大小

參數4:說明數據處理方式。如下圖:

?

關閉socket對象

int close (int __fd) : 會關閉讀寫通道

int shutdown (int __fd, int __how) :有三種關閉方式。

  • howto = 0 :關閉讀通道
  • howto = 1 :關閉寫通道
  • howto = 2 :完全關閉讀寫通道

?

獲取socket本地/對端信息

int getsocketname (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :獲得一個套接字的本地地址。成功0,失敗-1.

int getpeername (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :獲得已經連接上的套接字的遠程信息,如IP地址和端口

?

轉載于:https://www.cnblogs.com/dplearning/p/4693176.html

總結

以上是生活随笔為你收集整理的【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2的全部內容,希望文章能夠幫你解決所遇到的問題。

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