各位看官們,大家好,上一回中咱們說的是基於AF_UNIX域的流套接字通信的例子,這一回咱們說的例子是:基於AF_UNIX域的數據報套接字通信 。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
看官們,我們在上一回中一起制作了我們的第一道佳肴是:基於AF_UNIX域的流套接字通信。今天,我將和大家一起制作第二道佳肴:基於AF_UNIX域的數據報套接字通信。
制作第二道佳肴的菜譜:數據報套接字過程。 制作第二道佳肴的食材:數據報套接字的接口,套接字屬性,套接字地址信息。
看官們,以上的內容,我們在前面章回中都詳細介紹過,如果大家忘記的話,可以參考前面的內容,重點是第一百四十八回的內容,因為這是我們的菜譜。多說無益,我們通過具體的代碼來演示:
//1. 創建服務器端套接字
server_fd = socket(AF_UNIX,SOCK_DGRAM,0);
//2.設置服務器端套接字的屬性:域,類型和協議;
memset(&server_address,0,sizeof(struct sockaddr_un) );
server_address.sun_family = AF_UNIX;
strncpy(server_address.sun_path,SOCKET_PATH,sizeof(server_address.sun_path)-1 );
//3.把服務器端的套接字和服務器的地址綁定在一起
addr_len = sizeof(struct sockaddr_un);
res = bind(server_fd,(struct sockaddr *)&server_address,addr_len);
//4.通過套接字讀取數據,這裡使用的是recvfrom函數;
addr_len = 0;
res = recvfrom(server_fd,buf,BUF_SIZE,0,(struct sockaddr *)&client_address,&addr_len);
printf("[server] receiving data (%s) from client by socket\n",buf);
//5.釋放套接字,關閉通信
res = close(client_fd);
//1.創建客戶端套接字;
client_fd = socket(AF_UNIX,SOCK_DGRAM,0);
//2.設置客戶端套接字的屬性:域,類型和協議;
memset(&server_address,0,sizeof(struct sockaddr_un) );
server_address.sun_family = AF_UNIX;
strncpy(server_address.sun_path,SOCKET_PATH,sizeof(server_address.sun_path)-1 );
//3.通過套接字發送數據,這裡我們使用的是sendto函數;
printf("[client] sending data (%s )to server by socket \n",buf);
addr_len = sizeof(struct sockaddr_un);
res = sendto(client_fd,buf,sizeof(buf),0,(struct sockaddr *)&server_address,addr_len);
//4.釋放套接字,斷開客戶端與服務器端的通信;
res = close(client_fd);
看官們,以上是核心代碼,完整的代碼放到了我的資源中,大家可以下載使用。
我們需要把服務器端的代碼和客戶端的代碼分別進行編譯,並且編譯成不同的可以執行文件:
$ gcc Ex091_UnixDgramSocketClient.c -o client //編譯客戶端
$ gcc Ex091_UnixDgramSocketServer.c -o server //編譯服務器端
看官們,美味佳肴做好了,我們一起來品嘗下,品嘗方法就是運行程序,下面是程序的運行結果,請大家參考:
$ ./server & //在後面運行服務器
[1] 6733
$ ./client //運行客戶端
please input less then 8 chars for using.
hello
[client] sending data (hello )to server by socket
[server] receiving data (hello) from client by socket
[1]+ Done ./server //服務器運行結束
看官們,從上面的運行結果中可以看到,客戶端通過套接字發送數據給服務器,而服務器通過套接字接收客戶端發來的數據,這樣客戶端和服務器端可以通過套接字進行通信。另外,我們只進行了一次通信,通信的次數可以自己控制,甚至寫成無限次也是可以的。每次通信可以看作是一個完整的通信過程,我們在通信過程中發送的數據是字符串
各位看官,關於基於AF_UNIX域的數據報套接字通信的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。