linux-UNIX socket

UNIX域套接字

域套接字作为进程间通信的一种手段,值得我们研究一下。


域套接字实现本地进程间通信,同样有服务端和客户端之分。一个进程作为客户端,另一个进程作为服务端。这个和TCP socket类似,但是不一样。域套接字不经过底层网络。数据结构使用的是struct  sockaddr_un。对于这个结构,重点便是填充sun_family和sun_path,sun_path是文件路径。调用的socket接口也是socket、bind、listen、accept、connect、close这些,实际用起来可以看一下细节。

#include 
struct sockaddr_un {sa_family_t sun_family;	/* AF_UNIX */char sun_path[UNIX_PATH_MAX];	/* pathname */
};

服务端通信过程

1、socket()建立socket对象,指定协议类型为AF_LOCAL或者AF_UNIX

2、bind()绑定socket对象和socket类型的文件“server socket”

warnning:这里需要关注一下“server socket”这个文件。网络编程中,绑定的是ip和port,但是这里需要绑定的是socket类型的文件,如果在绑定之前,这个文件已经存在,则绑定会失败,因此,需要在bind之前和close之后,删除这个文件。

3、llisten()监听socket对象

4、accept()等待连接

5、read、write读写连接的socket对象,进行数据通信

6、close关闭连接的socket对象


客户端通信过程

1、socket()建立socket对象,指定协议类型为AF_LOCAL或者AF_UNIX

2、connet()连接服务端

3、连接成功开始数据通信

4、通信完成,close关闭socket


服务端代码:

#include 
#include 
#include 
#include 
#include 
#include #define MAX_SIZE 		1024
#define SOCKET_BACKLOG	1
#define SOCKET_STR 		"server_socket"
#define EXIT_STR		"exit"/* server */
int main()
{int serFd,serConFd;int cli_len, nBytes;struct sockaddr_un serAddr;struct sockaddr_un cliAddr;char msg[MAX_SIZE];unlink(SOCKET_STR);serFd = socket(AF_LOCAL, SOCK_STREAM, 0);memset(&serAddr, 0, sizeof(struct sockaddr_un));serAddr.sun_family = AF_LOCAL;strcpy(serAddr.sun_path, SOCKET_STR);bind(serFd, (struct sockaddr*)&serAddr, sizeof(struct sockaddr_un));listen(serFd, SOCKET_BACKLOG);cli_len = sizeof(struct sockaddr_un);printf("server is waiting for connection...\n");serConFd = accept(serFd, (struct sockaddr*)&cliAddr, &cli_len);printf("server-client connect established...\n");while(1){memset(msg, 0, MAX_SIZE);nBytes = read(serConFd, msg, MAX_SIZE);if (nBytes>0){printf("server recv:%s\n", msg);if (!strcmp(msg, EXIT_STR)) break;}}close(serConFd);unlink(SOCKET_STR);
}

客户端代码:

#include 
#include 
#include 
#include 
#include 
#include #define MAX_SIZE 		1024
#define SOCKET_BACKLOG	1
#define SOCKET_STR 		"server_socket"
#define EXIT_STR		"exit"/* client */
int main()
{int cliFd, iRet;struct sockaddr_un serAddr;char msg[MAX_SIZE];cliFd = socket(AF_LOCAL, SOCK_STREAM, 0);memset(&serAddr, 0, sizeof(struct sockaddr_un));serAddr.sun_family = AF_LOCAL;strcpy(serAddr.sun_path, SOCKET_STR);iRet = connect(cliFd, (struct sockaddr*)&serAddr, sizeof(struct sockaddr_un));if (-1 == iRet)exit(0);printf("server-client connect established...\n");while(1){memset(msg, 0, MAX_SIZE);fgets(msg, MAX_SIZE, stdin);if (msg[0] != '\n')msg[strlen(msg)-1] = '\0';write(cliFd, msg, strlen(msg));if (!strcmp(msg, EXIT_STR)) break;}close(cliFd);exit(0);
}

结果截图:


 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部