日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

本地套接字示例[来源:Advanced Linux Programming]

發布時間:2023/12/9 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 本地套接字示例[来源: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 宏計算得到??梢允褂萌魏挝募鳛樘捉幼致窂?#xff0c;但是進程必須對所指定的
目錄具有寫權限,以便向目錄中添加文件。如果一個進程要連接到一個本地套接字,則必須具有該套接字的讀權限。盡管多臺主機可能共享一個文件系統,只有同一臺主機上運行的程序之間可以通過本地套接字通信。

?

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 #78]$make gcc -g -c -o socket-server.o socket-server.c gcc -g -o socket-server socket-server.o gcc -g -c -o socket-client.o socket-client.c gcc -g -o socket-client socket-client.o [zcm@socket #79]$./socket-server /tmp/socket what can you do for me what are\nyou doing this program is great Quit [zcm@socket #80]$


運行客戶端:

?

[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]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。