【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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cuda编程基础
- 下一篇: '[linux下tomcat 配置