理解unix域套接字Word格式.docx
- 文档编号:22690427
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:9
- 大小:17.81KB
理解unix域套接字Word格式.docx
《理解unix域套接字Word格式.docx》由会员分享,可在线阅读,更多相关《理解unix域套接字Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
名为AF_suite的常量指定要在解释名称时使用的地址格式。
下面创建在同一计算机内部使用的数据报套接字:
s=socket(AF_UNIX,SOCK_DGRAM,0);
在大多数情况下,请将protocol参数设置为0(即缺省协议)。
本地名称绑定
创建套接字时不带名称。
只有在套接字绑定到地址之后,远程进程才能引用此套接字。
通信进程通过地址连接。
在UNIX系列中,连接通常包括一个或两个路径名。
UNIX系列套接字无需始终绑定到名称。
如果它们绑定到名称,则从不会存在绑定的重复排序组(如localpathname或foreignpathname)。
路径名不能涉及现有文件。
通过bind(3SOCKET)调用,进程可以指定套接字的本地地址。
这样会创建localpathname排序组,而connect(3SOCKET)和accept(3SOCKET)通过添加地址的远程部分来完成套接字的关联。
可以按如下方式使用bind(3SOCKET):
bind(s,name,namelen);
套接字句柄为s。
绑定名称是由支持协议解释的字节字符串。
UNIX系列名称包含一个路径名和一个系列。
本示例说明将名称/tmp/foo绑定到UNIX系列套接字。
#include<
sys/un.h>
...
structsockaddr_unaddr;
strcpy(addr.sun_path,"
/tmp/foo"
);
addr.sun_family=AF_UNIX;
bind(s,(structsockaddr*)&
addr,
strlen(addr.sun_path)+sizeof(addr.sun_family));
确定AF_UNIX套接字的大小时不计空字节,因此可以使用strlen(3C)。
addr.sun_path中引用的文件名在系统文件名称空间中创建为套接字。
调用方必须对创建addr.sun_path的目录具有写权限。
不再需要文件时,调用方应将其删除。
可以使用unlink(1M)删除AF_UNIX套接字。
建立连接
通常以非对称形式建立连接。
一个进程用作客户机,而另一个进程则用作服务器。
服务器将套接字绑定到与服务关联的已知地址,并阻塞在套接字上等待连接请求。
然后,不相关的进程便可连接到此服务器。
客户机通过启动到服务器套接字的连接,向服务器请求服务。
在客户端,connect(3SOCKET)调用启动连接。
在UNIX系列中,此连接可能如下所示:
structsockaddr_unserver;
server.sun.family=AF_UNIX;
...
connect(s,(structsockaddr*)&
server,strlen(server.sun_path)
+sizeof(server.sun_family));
有关连接错误的信息,请参见连接错误。
数据传送介绍如何传送数据。
关闭套接字介绍如何关闭套接字。
UNIX域流套接字例子:
-----------------------------------------------------------------------------------
UNIX域面向连接
UNIX域面向连接的服务器端程序
#include<
sys/types.h>
sys/socket.h>
......
#defineNAME"
my_sock"
main()
{
intorig_sock,//服务器端原来套接字描述符
new_sock,//新的套接字描述符
clnt_len,//客户端地址长度
i;
//循环计数器
staticstructsockaddr_unclnt_adr,//客户-服务器的UNIX地址
serv_adr;
staticcharbuf[128];
//消息缓冲区
voidclean_up(int,char*);
//关闭套接字并删除例程
if((orig_sock=socket(AF_UNIX,SOCK_STREAM,0))<
0)
peeror("
generateerror"
exit
(1);
}
serv_adr.sun_family=AF_UNIX;
strcpy(serv_adr.sun_path,NAME);
unlink(NAME);
if(bind(orig_sock,(structsockaddr*)&
serv_adr,sizeof(serv_adr.sun_family)
+strlen(serv_adr.sun_path))<
binderror"
clean_up(orig_sock,NAME);
exit
(2);
listen(orig_sock,1);
clnt_len=sizeof(clnt_adr);
if((new_sock=accept(orig_sock,(structsockaddr*)&
clnt_adr,&
clnt_len))<
0)
accepterror"
exit(3);
for(i=1;
i<
=10;
i++)
sleep
(1);
read(new_sock,buf,sizeof(buf));
printf("
%s\n\n"
buf);
close(new_sock);
exit(0);
}
voidclean_up(intsd,char*the_file)
close(sd);
unlink(the_file);
UNIX域面向连接的客户端程序
intorig_sock,//客户端原来套接字描述符
staticstructsockaddr_unserv_adr;
staticcharbuf[10];
if(connect(orig_sock,(structsockaddr*)&
connecterror"
sprintf(buf,"
c:
%d\n\n"
i);
write(orig_sock,buf,sizeof(buf));
close(orig_sock);
Socket(UDP)
UNIX域无连接
服务器端程序
stdio.h>
stdlib.h>
unistd.h>
string>
#defineSERVER_FILE"
server_socket"
main(void)
if((orig_sock=socket(AF_UNIX,SOCK_DGRAM,0))<
strcpy(serv_adr.sun_path,SERVER_FLIE);
//分配名字
unlink(SERVER_FLIE);
clean_up(orig_sock,SERVER_FLIE);
recvfrom(orig_sock,buf,sizeof(buf),0,(structsockaddr*)&
clnt_len);
}
客户端代码
int
orig_sock,
staticstructsockaddr_un
clnt_adr,
staticchar
buf[128];
client_flie[15];
sprintf(client_file,"
%07d_socket"
getpid());
clnt_adr.sun_family=AF_UNIX;
strcpy(clnt_adr.sun_path,client_file);
clnt_adr,sizeof(clnt_adr.sun_family)
+strlen(clnt_adr.sun_path))<
sendto(orig_sock,buf,sizeof(buf),0,(structsockaddr*)&
serv_adr,sizeof(structsockaddr));
clean_up(orig_sock,client_file);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理解 unix 套接