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 個函數來完成主機字節序和網絡字節序之間的轉換:
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);
- int bind( int sockfd, const struct sockaddr *addr, socklen_t
addrlen);
- int listen( int sockfd, int backlog);
- int accept( int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- int connect( int sockfd, const struct sockaddr *serv_addr, socklen_t
addrlen);
- int close( int sockfd);
- 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);
- 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);
總結
以上是生活随笔為你收集整理的Linux之socket网络编程(全)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转oracle 11g(21):修改为
- 下一篇: 怎么安装redhat linux操作系统