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

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux之socket网络编程(全)

發布時間:2023/12/10 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux之socket网络编程(全) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

socket網絡編程

  • 1、什么是套接字socket
  • 2、主機字節序列和網絡字節序列
  • 2、套接字地址結構
    • 2.1 通用 socket 地址結構
    • 2.2 專用 socket 地址結構
    • 2.3 IP 地址轉換函數
  • 3、網絡編程接口

1、什么是套接字socket

套接字(socket) 是一種通信機制,憑借這種機制,客戶/服務器系統的開發工作既可以在本地單
機上進行,也可以跨網絡進行。Linux所提供的功能( 如打印服務、連接數據庫和提供Web頁面)和網
絡工具(如用于遠程登錄的rlogin和用于文件傳輸的ftp)通常都是通過套接字來進行通信的。套接字的創建和使用與管道是有區別的,因為套接字明確地將客戶和服務器區分開來。套接字機制可以實現將多個客戶連接到一個服務器。

2、主機字節序列和網絡字節序列

(1)當在基于Intel處理器的Linux機器上運行新版本的服務器和客戶程序時,我們可以用netstat命令來查看網絡連接狀況。這個命令在大多數配置了網絡功能的UNIX系統上都能找到。它顯示了客戶/服
務器連接正在等待關閉。連接將在一小段超時時間之后關閉(具體的輸出內容將隨Linux版本的不同
而不同)。
(2)主機字節序列分為大端字節序和小端字節序,不同的主機采用的字節序列可能不同。大端字節序是指一個整數的高位字節存儲在內存的低地址處,低位字節存儲在內存的高地址處。小端字節序則是指整數的高位字節存儲在內存的高地址處,而低位字節則存儲在內存的低地址處。在兩臺使用不同字節序的主機之間傳遞數據時,可能會出現沖突。所以,在將數據發送到網絡時規定整形數據使用大端字節序,所以也把大端字節序成為網絡字節序列。對方接收到數據后,可以根據自己的字節序進行轉換。
Linux 系統提供如下 4 個函數來完成主機字節序和網絡字節序之間的轉換:

include <netinet/in.h>uint32_t htonl(uint32_t hostlong); // 長整型的主機字節序轉網絡字節序uint32_t ntohl(uint32_t netlong); // 長整型的網絡字節序轉主機字節序uint16_t htons(uint16_t hostshort); // 短整形的主機字節序轉網絡字節序uint16_t ntohs(uint16_t netshort); // 短整型的網絡字節序轉主機字節序

2、套接字地址結構

2.1 通用 socket 地址結構

socket 網絡編程接口中表示 socket 地址的是結構體 sockaddr,其定義如下:

#include <bits/socket.h>struct sockaddr{sa_family_t sa_family;char sa_data[14];};

sa_family 成員是地址族類型(sa_family_t)的變量。地址族類型通常與協議族類型對應。常見的協議族和對應的地址族如下圖所示:

2.2 專用 socket 地址結構

TCP/IP 協議族有 sockaddr_in 和 sockaddr_in6 兩個專用 socket 地址結構體,它們分別用于 IPV4 和 IPV6:

struct in_addr{u_int32_t s_addr;};struct sockaddr_in {sa_family_t sin_family;u_int16_t sin_port;struct in_addr sin_addr; }; struct in6_addr {unsigned char sa_addr[16]; // IPV6 地址,要用網絡字節序表示 }; struct sockaddr_in6 {sa_family_t sin6_family; // 地址族:AF_INET6u_inet16_t sin6_port; // 端口號:用網絡字節序表示u_int32_t sin6_flowinfo; // 流信息,應設置為 0struct in6_addr sin6_addr; // IPV6 地址結構體u_int32_t sin6_scope_id; // scope ID,尚處于試驗階段};
  • sin_family: 地址族 AF_INET
  • sin_port: 端口號,需要用網絡字節序表示
  • sin_addr: IPV4 地址結構:s_addr 以網絡字節序表示 IPV4 地址

2.3 IP 地址轉換函數

通常,人們習慣用點分十進制字符串表示 IPV4 地址,但編程中我們需要先把它們轉化為整數方能使用,下面函數可用于點分十進制字符串表示的 IPV4 地址和網絡字節序整數表示的 IPV4 地址之間的轉換:

#include <arpa/inet.h> in_addr_t inet_addr( const char *cp); //字符串表示的 IPV4 地址轉化為網絡字節序 char* inet_ntoa( struct in_addr in); // IPV4 地址的網絡字節序轉化為字符串表示

3、網絡編程接口

頭文件

#include <sys/types.h> #include <sys/socket.h>
  • int socket( int domain, int type, int protocol);
socket()創建套接字,成功返回套接字的文件描述符,失敗返回-1 domain: 設置套接字的協議簇, AF_UNIX AF_INET AF_INET6 type: 設置套接字的服務類型 SOCK_STREAM SOCK_DGRAM protocol: 一般設置為 0,表示使用默認協議
  • int bind( int sockfd, const struct sockaddr *addr, socklen_t
    addrlen);
bind()將 sockfd 與一個 socket 地址綁定,成功返回 0,失敗返回-1 sockfd 是網絡套接字描述符 addr 是地址結構 addrlen 是 socket 地址的長度
  • int listen( int sockfd, int backlog);
listen()創建一個監聽隊列以存儲待處理的客戶連接,成功返回 0,失敗返回-1 sockfd 是被監聽的 socket 套接字 backlog 表示處于完全連接狀態的 socket 的上限
  • int accept( int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept()從 listen 監聽隊列中接收一個連接,成功返回一個新的連接 socket,該 socket 唯一地標識了被接收的這個連接,失敗返回-1sockfd 是執行過 listen 系統調用的監聽 socketaddr 參數用來獲取被接受連接的遠端 socket 地址addrlen 指定該 socket 地址的長度
  • int connect( int sockfd, const struct sockaddr *serv_addr, socklen_t
    addrlen);
connect()客戶端需要通過此系統調用來主動與服務器建立連接,成功返回 0,失敗返回-1 sockfd 參數是由 socket()返回的一個 socket。 serv_addr 是服務器監聽的 socket 地址 addrlen 則指定這個地址的長度
  • int close( int sockfd);
close()關閉一個連接,實際上就是關閉該連接對應的 socket
  • ssize_t recv( int sockfd, void *buff, size_t len, int flags);
  • ssize_t send( int sockfd, const void *buff, size_t len, int flags);
TCP 數據讀寫:recv()讀取 sockfd 上的數據,buff 和 len 參數分別指定讀緩沖區的位置和大小send()往 socket 上寫入數據,buff 和 len 參數分別指定寫緩沖區的位置和數據長度flags 參數為數據收發提供了額外的控制
  • ssize_t recvfrom( int sockfd, void buff, size_t len, int
    flags,struct sockaddr src_addr, socklen_t*addrlen);
  • ssize_t sendto( int sockfd, void buff, size_t len, int flags,struct
    sockaddr dest_addr, socklen_t addrlen);
UDP 數據讀寫:recvfrom()讀取 sockfd 上的數據,buff 和 len 參數分別指定讀緩沖區的位置和大小src_addr 記錄發送端的 socket 地址addrlen 指定該地址的長度 sendto()往 socket 上寫入數據,buff 和 len 參數分別指定寫緩沖區的位置和數據長度dest_addr 指定接收數據端的 socket 地址addrlen 指定該地址的長度

總結

以上是生活随笔為你收集整理的Linux之socket网络编程(全)的全部內容,希望文章能夠幫你解決所遇到的問題。

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