程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Linux編程-回憶錄七,linux編程回憶錄

Linux編程-回憶錄七,linux編程回憶錄

編輯:關於C語言

Linux編程-回憶錄七,linux編程回憶錄


====網絡通信====
#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失敗

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved