linux socket 程式設計總結
阿新 • • 發佈:2018-12-04
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);
domain引數 可指定的協議族
域 | 說明 |
AF_UNIX | UINX域協議(檔案系統套接字) |
AF_INET | ARPA因特網協議(UNIX套接字) |
AF_ISO | ISO標準協議 |
AF_NS | 施樂(Xerox)網路系統協議 |
AF_IPX | Novell IPX協議 |
AF_APPLETA;LK | Appletalk DDS |
type
SOCK_STREAM 和 SOCK_DGRAM
套接字地址
AF_UNIX 套接字來說,它的地址由sockaddr_un來描述,該結構定義在標頭檔案sys/un.h中
在AF_INET域中,套接字地址由sockaddr_in來指定,該結構定義在netinet/in.h中,它至少包含以下幾個成員:struct sockaddr_un{ sa_family_t sun_family;/*AF_UNIX*/ char sun_path[];/*pathname*/ }
struct sockaddr_in{
short int sin_family;/*AF_UNIX*/
unsigned short int sin_port;/*Port number*/
struct in_addr sin_addr;/**Internet address/
}
IP地址結構in_addr被定義為:
struct in_addr{ unsigned long int s_addr; }
命名套接字
#include<sys/socket.h>
int bind(int socket, const struct sockaddr *address, size_t address_len);
地址的長度和格式取決於地址族,如上。需要強制轉換成需要的結構(struct sockaddr *)
建立套接字佇列
#include <sys/socket.h>
int listen(int socket, int backlog);
backlog 設定佇列中可以容納的未處理連結的最大數目
接受連線
#include <sys/socket.h>
int accept(int socket, struct sockaddr *address, size_t *address_len);
返回新的套接字的描述符,第2個引數返回客戶的地址,第3個引數返回客戶地址的長度
如果套接字佇列中沒有未處理的連線,accecpt函式將阻塞直到客戶建立連線為止。我們可以通過對套接字檔案描述符設定O_NONBLOCK標誌來改變這一行為,使用函式是fnctl:
int flags = fnctl(socket,F_GETFL,0);
fnctl(socket, F_SETFL,O_NONBLOCK|flags);
請求連線
#include<sys/socket.h>
int connect(int socker, const struct sockaddr *address, size_t address_len);
引數socket指定的套接字將連線到引數address指定的伺服器套接字,address指向的結構的長度由引數address_len指定。
主機位元組序&&網路位元組序
不同型別的計算機使用不同的位元組序來表示整數,如大小端,解釋位元組的方式。因此需要定義一個網路位元組序使得各個裝置之間保持一致。
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
套接字選項
#include <sys/socket.h>
int setsockopt(int sock, int level, int option_name,const void *option_value, size_t option_len);
選項 | 說明 |
SO_DEBUG | 開啟除錯資訊 |
SO_KEEPALIVE | 通過定時傳輸保持存活報文來維持了連線 |
SO_LINGER | 在close呼叫返回之前完成傳輸工作 |
網路資訊
主機資料庫在介面標頭檔案netdb.h中宣告
#include <netdb.h>
struct hostent *gethostbyaddr(const void *addr, size_t len, int type);
struct hostent *gethostbyname(const char *name);
struct hostent {
char *h_name;/*name of the host*/
char **h_aliases;/*list of aliases(nicknames)*/
int h_addrtype;/*address type*/
int h_length;/*length in bytes of the address*/
char **h_addr_list/*list of address (network order)*/
};
與服務及其相關的資訊可以通過一些服務函式來獲取
#include <netdb.h>
struct servent {
char *s_name; /*name of the service*/
char **s_aliases; /*list of aliases(alternative names)*/
int s_port;/*The IP port number*/
char *s_proto; /*The service type , unsually "tcp" or "udp"*/
};
#include <arpa/inet.h>
char *inet_ntoa(struct in_addr in);
這個函式的作用是:將一個因特網主機地址轉換為一個點分四元組式的字串
#include <inistd.h>
int gethostname(char *name, int namelength);
這個函式的作用是:將當前主機的名字寫入name指向的字串。若主機名將被截斷
tips:
通過killall serve1來殺死程式