本地套接字示例[来源:Advanced Linux Programming]
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                本地套接字示例[来源:Advanced Linux Programming]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                ?本地套接字示例[來源:Advanced Linux Programming]
  要通過套接字連接同一臺主機上的進程,可以使用符號常量 PF_LOCAL 和 PF_UNIX所代表的本地命名空間。它們被稱為本地套接字(local sockets)或者 UNIX 域套接字(UNIX-domain sockets)。它們的套接字地址用文件名表示,且只在建立連接的時候使用。
   套接字的名字在 struct sockaddr_un 結構中指定。你必須將 sun_family 字段設置為 AF_LOCAL 以表明它使用本地命名空間。該結構中的 sun_path 字段指定了套接字使用的路徑,該路徑長度必須不超過 108 字節。而 struct sockaddr_un 的實際長度應由UN_LENG 宏計算得到。可以使用任何文件名作為套接字路徑,但是進程必須對所指定的
 目錄具有寫權限,以便向目錄中添加文件。如果一個進程要連接到一個本地套接字,則必須具有該套接字的讀權限。盡管多臺主機可能共享一個文件系統,只有同一臺主機上運行的程序之間可以通過本地套接字通信。
?
socket-server.c
/* zzb 2011-11-17 22:30<<高級Linux編程.pdf>> page101: socket-server.c功能:本地命名空間套接字服務器 */#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h>int server(int client_socket) {int length;char *text;if(read(client_socket, &length, sizeof(length)) == 0) // 獲取消息長度,保存到lengthreturn 0;text = malloc(length); // 分配用于保存信息的緩沖區read(client_socket, text, length);printf("%s\n", text);if(!strcasecmp(text, "quit")) // 忽略大小寫比較字符串{free(text); // 釋放緩沖區return 1;}free(text);return 0; }int main(int argc, char *argv[]) {const char* const socket_name = argv[1];int sock_fd;struct sockaddr_un name;int client_sent_quit_message;if((sock_fd = socket(PF_LOCAL, SOCK_STREAM, 0)) == -1){perror("socket");return 1;}name.sun_family = AF_LOCAL;strcpy(name.sun_path, socket_name);if(bind(sock_fd, (const struct sockaddr*)&name, SUN_LEN(&name)) == -1){perror("bind");return 1;}if(listen(sock_fd, 5) == -1){perror("listen");return 1;}do{struct sockaddr_un client_name;socklen_t client_name_len;int client_socket_fd;client_socket_fd = accept(sock_fd, (struct sockaddr*)&client_name, &client_name_len);client_sent_quit_message = server(client_socket_fd);close(client_socket_fd);}while(!client_sent_quit_message);close(sock_fd); // 關閉套接字文件unlink(socket_name); // 刪除套接字文件return 0; }?
socket-client.c
/* zzb 2011-11-17 22:37<<高級Linux編程.pdf>> page103: socket-client.c功能:本地命名空間套接字服務器 */#include <stdio.h> #include <string.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h>void write_text(int socket_fd, const char* text) {int length = strlen(text) + 1;write(socket_fd, &length, sizeof(length)); // 寫入長度信息write(socket_fd, text, length); // 寫入消息 }int main(int argc, char *argv[]) {const char* const socket_name = argv[1]; // 套接字文件路徑const char* const message = argv[2]; // 要發送的消息int socket_fd;struct sockaddr_un name;socket_fd = socket(PF_LOCAL, SOCK_STREAM, 0); // 創建本地套接字name.sun_family = AF_LOCAL;strcpy(name.sun_path, socket_name);connect(socket_fd, (const struct sockaddr*)&name, SUN_LEN(&name)); // 連接套接字write_text(socket_fd, message); // 向套接字寫入數據close(socket_fd);return 0; }
 編譯運行:
 運行客戶端:
?
[zcm@socket #19]$./socket-client /tmp/socket "what can you do for me" [zcm@socket #20]$./socket-client /tmp/socket "what are\nyou doing" [zcm@socket #21]$./socket-client /tmp/socket "this program is great" [zcm@socket #22]$./socket-client /tmp/socket "Quit" [zcm@socket #23]$
 
 ?
?
總結
以上是生活随笔為你收集整理的本地套接字示例[来源:Advanced Linux Programming]的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: win10自动停用打印服务器,雨林木风w
- 下一篇: 使用msui的回到顶部的一个小问题
