====網絡通信====
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
創建套接字,domain的值如下:
AF_UNIX unix域套接字,本地使用
AF_INET IPV4套接字
AF_INET6 IPV6套接字
type有兩種: SOCK_STREAM(TCP流), SOCK_DGRAM(UDP流)
protocol基本恆為0,極少數會去設置它
返回0成功創建,-1失敗
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
綁定套接字到addr地址,返回0成功,-1失敗
#include <sys/socket.h>
int listen(int sockfd, int backlog);
監聽套接字鏈接,成功返回0,-1失敗
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
接受客戶的鏈接,返回一個文件描述符,出錯返回-1值
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
建立到addr地址的鏈接,成功返回0,失敗返回-1值
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buffer, size_t length, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
接受UDP數據,成功返回接受的字節數,返回0表示接受完成,-1出錯
ssize_t sendto(int sockfd, const void *buffer, size_t length,
int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
發送UDP數據,成功返回實際發送的字節數,返回-1出錯
UNIX套接字地址結構
struct sockaddr_un {
sa_family_t sun_family; /* 永遠等於AF_UNIX */
char sun_path[108]; /* 域路徑名稱,以'\0'結束 */
};
#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sockfd[2]);
用於進程之間,創建unix域套接字,成功返回0,-1失敗
#include <arpa/inet.h>
uint16_t htons(uint16_t host_uint16);
uint16主機字節序轉換為網絡字節序
uint32_t htonl(uint32_t host_uint32);
uint32主機字節序轉換為網絡字節序
uint16_t ntohs(uint16_t net_uint16);
uint16網絡字節序轉換位主機字節序
uint32_t ntohl(uint32_t net_uint32);
uint32網絡字節序轉換位主機字節序
struct in_addr {
in_addr_t s_addr /*無符號的32位整數 */
};
struct sockaddr_in {
sa_family_t sin_family; /* 永遠標為AF_INET */
in_port_t sin_port /* 端口 */
struct in_addr sin_addr; /* IP地址 */
unsinged char __pad[X]; /* 僅用於結構對齊 */
};
sin_port,sin_addr是網絡字節序
struct in6_addr {
uint8_t s6_addr[16]; /* IP6地址 */
};
struct sockaddr_in6 {
sa_family_t sin6_family; /*永遠標為AF_INET6 */
in_port_t sin6_port; /* 端口 */
uint32_t sin6_flowinfo; /* IPV6 FLOW INFO */
struct in6_addr sin6_addr; /* IPV6地址 */
uint32_t sin6_scope_id; /* 新增的(kernel2.4以上) */
};
全部結構都是網絡字節序
#include <arpa/inet.h>
int inet_pton(int domain, const char *src_str, void *addrptr);
轉換字符串格式的IP地址為對應的結構體, 返回0成功,-1出錯
const char *inet_ntop(int domain, const void *addrptr,
char *dst_str, size_t len);
轉換地址結構體為對應的字符串格式,返回0成功,-1出錯
#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo(const char *host, const char *service,
const struct addrinfo *hints, struct addrinfo **result);
得到hostname,或是service name的IP地址信息,返回0成功,-1失敗
#include <sys/socket.h>
#include <netdb.h>
void freeaddrinfo(struct addrinfo *result);
釋放上面函數獲得IP地址信息,分配的內存
#include <sys/socket.h>
int shutdown(int sockfd, int how);
關閉套接字,方式如下:
1.SHUT_RD 關閉讀
2.SHUT_WR 關閉寫
返回0表示成功,-1出錯
#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
返回本地/對端的套接字地址信息,返回0成功,-1失敗
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
通過套接字傳輸一個文件的內容,返回傳輸的字節數,返回-1出錯
include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
獲取/設置套接字的屬性,返回0成功,-1失敗