转载请标明出处:http://www.jianshu.com/users/183339cdc7ae/latest_articles
概述
socket通信是大家耳熟能详的一种进程间通信方式(IPC),它是一种全双工的通信方式,不同于pipe这种单工方式.这篇文章将深入浅出的讲解一下什么是socket。
我们常说的socket通信有以下二种,主要会说一下Unix domain socket
Internet domain socket
该socket可以用于不同主机间的通信,就像聊QQ一样只要知道了对方的QQ号就可以聊天了。socket只要知道了对方的ip地址和端口就可以通信了所以这种socket通信是基于网络协议栈的。
Unix domain socket
该socket用于一台主机的进程间通信,不需要基于网络协议,主要是基于文件系统的。与Internet domain socket类似,需要知道是基于哪一个文件(相同的文件路径)来通信的
unix domain socket有2种工作模式一种是SOCK_STREAM,类似于TCP,可靠的字节流。另一种是SOCK_DGRAM,类似于UDP,不可靠的字节流。
工作模型
socket通信有一个服务端,一个客服端
服务端:创建socket—绑定文件(端口)—监听—接受客户端连接—接收/发送数据—…—关闭
客户端:创建socket—绑定文件(端口)—连接—发送/接收数据—…—关闭
代码框架
server
sockaddr_un :为一个系统级的结构体,主要用于存储地址
#define NAME "socketAddr"
main(){
...
struct sockaddr_un server;
...
int sock = socket(AF_UNIX, SOCK_STREAM, 0);
strcpy (server.sun_path, NAME);
...
bind(sock, (structsockaddr *) &server, sizeof(struct sockaddr_un));
...
listen(sock, 5);
...
while(1){
...
msgsock = accept(sock, 0, 0);
...
rval = read(msgsock, buf, 1024))
...
}
}
client
#define NAME "socketAddr"
main(){
...
sock = socket(AF_UNIX, SOCK_STREAM, 0);
strcpy(server.sun_path, NAME);
...
if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) {
close(sock);
exit(1);
}
if (write(sock, DATA, sizeof(DATA)) < 0)
perror("writing on stream socket");
close(sock);
}
demo下载
github下载
使用:
- gcc service.c -o service
- gcc client.c -o client
- linux下启动一个窗口运行 ./service
- 启动另一个窗口运行 ./client socket 【这个socket为service中绑定的地址】
运行后可以发现,在当前目录下会多一个名叫socket的文件,这2个进程就是基于该文件通信的
网友评论