第十四章 unix域套接字

2021-08-26 10:43:45 字數 2622 閱讀 1137

unix域套接字實際上不是乙個實際的協議,他只是在同一臺主機上客戶和伺服器之間通訊時,使用與在不同主機上客戶和伺服器間通訊時相同的api

unix域套接字分為兩種:位元組流套接字和資料報套接字

unix域套接字的好處:

1 在同一臺主機上進行通訊時,是不同主機間通訊的兩倍

2 unix域套介面可以在同一臺主機上,不同程序之間傳遞套接字描述符

3 unix域套接字可以向伺服器提供客戶的憑證(使用者id或者使用者組id)

並且是以s開頭的檔案

struct sockaddr_un

int socketpair(int family, int type, intprotocol, int sockfd[2]);這個函式建立兩個互相連線的套接字(socketfd[2])family 是af_local, type可以是sock_stream (位元組流)或者sock_dgram(資料報),協議是0,之後就能夠或者兩個互相連線的套接字

以sock_stream呼叫的socketpair函式得到的套接字叫做流管道(stream pipe),是全雙工的,就是這兩個套接字是可讀可寫的

1在unix域套接字進行bind的時候建立套介面檔案,其預設的許可權值是0777,並被當前的umask修改,看上圖就知道,umask是0022 的到的檔案許可權是0755

2關於bind建立檔案中位址引數 sockaddr_un 中的sun_path需要是絕對路徑,這樣才能不用考慮相對的概念。防止客戶端程式也用相對路徑,但是和伺服器不在同乙個目錄的考慮

3 connect中的位址中的路徑名必須是套介面檔案,而且已經被服務端繫結的,以下情況會出錯:1 檔案路徑存在但是不是套介面檔案2 路徑名存在且是套介面檔案,但是沒有和該檔案繫結的套介面3 就是type必須和伺服器相同

4 connect連線unix套介面的時候的許可權檢查和open函式一樣的

5 unix域位元組流套介面和tcp一樣都給程序提供乙個無記錄邊界的位元組流介面

6 unix域套介面connect發現等待佇列滿了,就直接返回econnrefusrd錯誤,說連線拒絕錯誤

7 unix域資料報套介面和udp一樣提供乙個保留記錄邊界的不可靠資料報服務

unix域套接字的客戶端:

#include #include #include #include #include #include #define max_send 1025

#define unix_path "/tmp/sinfor"

void dump_unix(int sock_fd)

; char recv[max_send] = ;

while(fgets(tmp, max_send, stdin) != null) }

int main(int argc, char** argv)

struct sockaddr_un addr;

bzero(&addr, sizeof(addr));

addr.sun_family = af_local;

strcpy((void*)&addr.sun_path, unix_path);

if(connect(conn_sock, (struct sockaddr*)&addr, sizeof(addr)) < 0)

dump_unix(conn_sock);

close(conn_sock);

return 0;

}

unix域套接字的伺服器;

#include #include #include #include #include #include #include #include #define max_recv 1025

#define unix_serv_path "/tmp/sinfor"

void client_dump(int sock_fd)

; int size;

while((size = read(sock_fd, rec, max_recv)) != 0) }

void sig_son(int num)

int main(int argc, char** argv)

struct sockaddr_un ser_addr, cli_addr;

ser_addr.sun_family = af_local;

strcpy(ser_addr.sun_path, unix_serv_path);

unlink(unix_serv_path);

bind(acc_sock, (struct sockaddr*)&ser_addr, sizeof(ser_addr));

listen(acc_sock, 5);

signal(sigchld, sig_son);

while(1)

else

}if(fork() == 0)

close(dump_sock);

} close(acc_sock);

return 0;

}

這章還有使用者認證和描述符通過unix套接字在不同程序之間傳遞,看完了,太累了,就不寫了,有興趣的自己看看unp吧

網路程式設計第十四章 套接字超時

在套接字上設定超時的方法有以下三種 1 呼叫alarm,產生sigalarm訊號,2 在select阻塞等待io 3 使用so rcvtimeo和so rndtimeo選項。這個方法的問題在於並非所有實現都支援這個兩個選項。alarm include unp.h static void connec...

UNPv1第十四章 Unix域協議

unix域協議並不是乙個實際的協議族,它只是在同一臺主機上進行客戶 伺服器通訊時,使用與在不同主機上的客戶和伺服器間通訊時相同的api 套介面或xti 的一種方法。當客戶和伺服器在同一臺主機上時,unix域協議是ipc通訊方式的一種替代品。unix域提供了兩種型別的套介面 位元組流套介面 與tcp類...

第十四章約束

約束 constraint 是一種保證資料完整性的規則。約束設定在單個字段或者多個字段組合上,寫入這些欄位的行資料必須要符合約束的規則 約束的五種型別 not null 非空約束,指定某列的所有行資料不能包含空值 unique 唯一性約束,指定列或者列的組合的所有行資料必須唯一 primary ke...