转自:http://www.groad.net/bbs/thread-1709-1-1.html
程序说明:
程序里包含服务端和客户端两个程序,它们之间使用 AF_UNIX 实现本机数据流通信。使用 AF_UNIX 域实际上是使用本地 socket 文件来通信。
服务器端代码:
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> int main (int argc, char *argv[]) { int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_un server_address; /*声明一个UNIX域套接字结构*/ struct sockaddr_un client_address; int i, bytes; char ch_send, ch_recv; unlink ("server_socket"); /*删除原有server_socket对象*/ /*创建 socket, 通信协议为AF_UNIX, SCK_STREAM 数据方式*/ server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0); /*配置服务器信息(通信协议)*/ server_address.sun_family = AF_UNIX; /*配置服务器信息(socket 对象)*/ strcpy (server_address.sun_path, "server_socket"); /*配置服务器信息(服务器地址长度)*/ server_len = sizeof (server_address); /*绑定 socket 对象*/ bind (server_sockfd, (struct sockaddr *)&server_address, server_len); /*监听网络,队列数为5*/ listen (server_sockfd, 5); printf ("Server is waiting for client connect... "); client_len = sizeof (client_address); /*接受客户端请求; 第2个参数用来存储客户端地址; 第3个参数用来存储客户端地址的大小*/ /*建立(返回)一个到客户端的文件描述符,用以对客户端的读写操作*/ client_sockfd = accept (server_sockfd, (struct sockaddr *)&server_address, (socklen_t *)&client_len); if (client_sockfd == -1) { perror ("accept"); exit (EXIT_FAILURE); } printf ("The server is waiting for client data... "); for (i = 0, ch_send = '1'; i < 5; i++, ch_send++) { if ((bytes = read (client_sockfd, &ch_recv, 1)) == -1) { perror ("read"); exit (EXIT_FAILURE); } printf ("The character receiver from client is %c ", ch_recv); sleep (1); if ((bytes = write (client_sockfd, &ch_send, 1)) == -1) { perror ("read"); exit (EXIT_FAILURE); } } close (client_sockfd); unlink ("server socket"); }
客户端代码:
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> int main (int argc, char *argv[]) { struct sockaddr_un address; int sockfd; int len; int i, bytes; int result; char ch_recv, ch_send; /*创建socket,AF_UNIX通信协议,SOCK_STREAM数据方式*/ if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror ("socket"); exit (EXIT_FAILURE); } address.sun_family = AF_UNIX; strcpy (address.sun_path, "server_socket"); len = sizeof (address); /*向服务器发送连接请求*/ result = connect (sockfd, (struct sockaddr *)&address, len); if (result == -1) { printf ("ensure the server is up "); perror ("connect"); exit (EXIT_FAILURE); } for (i = 0, ch_send = 'A'; i < 5; i++, ch_send++) { if ((bytes = write(sockfd, &ch_send, 1)) == -1) { /*发消息给服务器*/ perror ("write"); exit (EXIT_FAILURE); } sleep (2); /*休息二秒钟再发一次*/ if ((bytes = read (sockfd, &ch_recv, 1)) == -1) { /*接收消息*/ perror ("read"); exit (EXIT_FAILURE); } printf ("receive from server data is %c ", ch_recv); } close (sockfd); return (0); }
程序说明:
先运行服务器端,然后再运行客户端可以在两边同时看到输出。服务器端先运行后会出现如下提示:
./sock_local_server Server is waiting for client connect...
这表示,服务器端已经被阻塞到到 accept() 这里,服务器就在此等候客户端的连接。
如果不是先运行服务器端,而直接运行客户端,那么客户端会提示:
./sock_local_client ensure the server is up connect: Connection refused
提示服务器没有准备好,连接被拒绝,从而直接退出程序。
如果服务器和客户端依次运行,可以在两边看到输出:
服务器端:
./sock_local_server Server is waiting for client connect... The server is waiting for client data... The character receiver from client is A The character receiver from client is B The character receiver from client is C The character receiver from client is D The character receiver from client is E
客户端:
./sock_local_client receive from server data is 1 receive from server data is 2 receive from server data is 3 receive from server data is 4 receive from server data is 5