当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 【转】本地通信实例(AF_UNIX) socket协议通信
帖子发表于 : 2011-01-14 0:37 
头像

注册: 2010-04-20 22:28
帖子: 52
送出感谢: 0 次
接收感谢: 0 次
程序说明:
程序里包含服务端和客户端两个程序,它们之间使用 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...\n");

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...\n");

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\n", 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\n");
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\n", 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


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 【转】本地通信实例(AF_UNIX) socket协议通信
帖子发表于 : 2011-01-14 0:38 
头像

注册: 2010-04-20 22:28
帖子: 52
送出感谢: 0 次
接收感谢: 0 次
自己正在学习socket协议,看到这篇很好就转载过来了,在这里感谢原文作者
先给自己顶一下^_^


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译