一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)相关的知识,希望对你有一定的参考价值。
各位看官们,大家好,上一回中咱们说的是基于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 //服务器运行结束
看官们,从上面的运行结果中可以看到,客户端通过套接字发送数据给服务器,而服务器通过套接字接收客户端发来的数据,这样客户端和服务器端可以通过套接字进行通信。另外,我们只进行了一次通信,通信的次数可以自己控制,甚至写成无限次也是可以的。每次通信可以看作是一个完整的通信过程,我们在通信过程中发送的数据是字符串 “hello” ,大家也可以发送其它的字符串。
各位看官,关于基于AF_UNIX域的数据报套接字通信的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。
以上是关于一起talk C栗子吧(第一百五十七回:C语言实例--基于AF_UNIX域的数据报套接字通信)的主要内容,如果未能解决你的问题,请参考以下文章
一起talk C栗子吧(第一百一十七回:C语言实例--线程死锁一)
一起talk C栗子吧(第一百五十一回:C语言实例--socket通信地址)
一起talk C栗子吧(第一百五十五回:C语言实例--获取socket通信地址)
一起talk C栗子吧(第一百五十四回:C语言实例--socket通信地址系统调用二)