#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <unistd.h>
#define MSG_ADDR_A "/var/msg_addr_a"
#define MSG_ADDR_B "/var/msg_addr_b"
#define CMDLINE_LEN 512
int init_sock(int fg)
{
int l_sockfd = -1;
int l_ret = -1;
struct sockaddr_un st_sock_addr;
l_sockfd = socket(AF_UNIX,SOCK_DGRAM,0);
if (l_sockfd < 0) {
perror("cannot create the new cmd sock");
return -1;
}
if (fg == 0) {
st_sock_addr.sun_family = AF_UNIX;
strcpy(st_sock_addr.sun_path, MSG_ADDR_A);
unlink(MSG_ADDR_A);
l_ret = bind(l_sockfd, (struct sockaddr*)&st_sock_addr, sizeof(st_sock_addr));
if (l_ret == -1) {
perror("cannot bind the new cmd sock");
close(l_sockfd);
unlink(MSG_ADDR_A);
return -1;
}
} else {
st_sock_addr.sun_family = AF_UNIX;
strcpy(st_sock_addr.sun_path, MSG_ADDR_B);
unlink(MSG_ADDR_B);
l_ret = bind(l_sockfd, (struct sockaddr*)&st_sock_addr, sizeof(st_sock_addr));
if (l_ret == -1) {
perror("cannot bind the new cmd sock");
close(l_sockfd);
unlink(MSG_ADDR_B);
return -1;
}
}
return l_sockfd;
}
void msg_proc(int fg)
{
int fd = -1;
socklen_t addr_len;
struct sockaddr_un st_source_addr;
unsigned char cmdbuf[CMDLINE_LEN];
int l_ret = -1;
fd = init_sock(fg);
if (fd == -1) {
printf( "[%s]create cmd unix socket err! \n", __func__);
exit(1);
}
addr_len = sizeof(struct sockaddr_un);
if (fg) {
struct sockaddr_un st_sock_addr;
st_sock_addr.sun_family = AF_UNIX;
strcpy(st_sock_addr.sun_path, MSG_ADDR_A);
l_ret = sendto(fd, "1234", strlen("1234"), 0,
(struct sockaddr*)&st_sock_addr, sizeof(st_sock_addr));
bzero(cmdbuf, CMDLINE_LEN);
usleep(100000);
//l_ret = recvfrom(fd, cmdbuf, CMDLINE_LEN, 0, (struct sockaddr*)&st_sock_addr, &addr_len);
l_ret = recvfrom(fd, cmdbuf, CMDLINE_LEN, MSG_DONTWAIT, (struct sockaddr*)&st_sock_addr, &addr_len);
printf("cmd=%s\n", cmdbuf);
} else {
while (1) {
bzero(cmdbuf, CMDLINE_LEN);
l_ret = recvfrom(fd, cmdbuf, CMDLINE_LEN, 0, (struct sockaddr*)&st_source_addr,
&addr_len);
if (-1 == l_ret) {
perror("recv");
printf( "[%s]recv config err! .\n", __func__);
sleep(1);
continue;
}
printf("cmd=%s, path=%s\n", cmdbuf, st_source_addr.sun_path);
struct sockaddr_un st_des_addr;
st_des_addr.sun_family = AF_UNIX;
strcpy(st_des_addr.sun_path, MSG_ADDR_B);
l_ret = sendto(fd, "4567", strlen("4567"), 0,
(struct sockaddr*)&st_des_addr, sizeof(st_des_addr));
}
}
}
/*
gcc -o unix_udp unix_udp.c
server run: ./unix_udp 0
client run: ./unix_udp 1
*/
int main(int argc, char **argv)
{
int arg = atoi(argv[1]);
msg_proc(arg);
return 0;
}
unix socket编程
该代码示例展示了如何使用Unix域套接字(UDP)在两个进程中进行通信。`init_sock`函数创建并绑定套接字到指定路径,`msg_proc`函数接收和发送消息。主函数根据命令行参数启动服务器或客户端。这是一个简单的Unix域套接字通信模型,用于进程间的命令传递。
摘要由CSDN通过智能技术生成