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...