网上的例子不是很全,记录一下C语言实现的uds udp通信。
client和server分别创建两个socket,一个用来发送,一个用来接收
//server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
int sock_r;
int sock_s;
int my_create_sock(char *path)
{
int sock = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, path);
if (!access(path, F_OK)) {
remove(path);
}
if (sock < 0) {
printf("create %s sock fail! %d\n", path, errno);
return -1;
}
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
printf("bind %s sock fail! %d\n", path, errno);
return -1;
}
return sock;
}
int my_sock_init(void)
{
sock_r = my_create_sock("eth_s_recv.sock");
sock_s = my_create_sock("eth_s_send.sock");
if ((sock_r < 0) || (sock_s < 0)) {
printf("sock create fail\n");
return -1;
}
return 0;
}
int my_uds_send_msg(int sock, char *path, char *data, int len)
{
struct sockaddr_un serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, path);
if (sendto(sock, data, len, 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {
printf("send to %s fail! %d\n", path, errno);
return -1;
}
printf("send to %s success!\n", path);
return 0;
}
int my_uds_recv_msg(int sock, char *data)
{
struct sockaddr_un serveraddr;
int size, len;
size = recvfrom(sock, data, 1024, 0, (struct sockaddr*)&serveraddr, &len);
if (size < 0) {
printf("recv fail! %d\n", errno);
return -1;
}
return size;
}
void my_sock_release(void)
{
if (close(sock_s) < 0) {
printf("close sock fail! %d\n", sock_s);
}
if (close(sock_r) < 0) {
printf("close sock fail! %d\n", sock_r);
}
}
int main(void)
{
char data[1024];
if (my_sock_init()) {
return -1;
}
if (my_uds_recv_msg(sock_r, data) > 0) {
printf("%s\n", data);
}
while (!my_uds_send_msg(sock_s, "eth_c_recv.sock", "Hello world: MY", 15)) {
sleep(1);
}
my_sock_release();
return 0;
}
//client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
int sock_r;
int sock_s;
int my_create_sock(char *path)
{
int sock = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, path);
if (!access(path, F_OK)) {
remove(path);
}
if (sock < 0) {
printf("create %s sock fail! %d\n", path, errno);
return -1;
}
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
printf("bind %s sock fail! %d\n", path, errno);
return -1;
}
return sock;
}
int my_sock_init(void)
{
sock_r = my_create_sock("eth_c_recv.sock");
sock_s = my_create_sock("eth_c_send.sock");
if ((sock_r < 0) || (sock_s < 0)) {
printf("sock create fail\n");
return -1;
}
return 0;
}
int my_uds_send_msg(int sock, char *path, char *data, int len)
{
struct sockaddr_un serveraddr;
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, path);
if (sendto(sock, data, len, 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {
printf("send to %s fail! %d\n", path, errno);
return -1;
}
printf("send to %s success!\n", path);
return 0;
}
int my_uds_recv_msg(int sock, char *data)
{
struct sockaddr_un serveraddr;
int size, len;
size = recvfrom(sock, data, 1024, 0, (struct sockaddr*)&serveraddr, &len);
if (size < 0) {
printf("recv fail! %d\n", errno);
return -1;
}
return size;
}
void my_sock_release(void)
{
if (close(sock_s) < 0) {
printf("close sock fail! %d\n", sock_s);
}
if (close(sock_r) < 0) {
printf("close sock fail! %d\n", sock_r);
}
}
int main(void)
{
char data[1024];
if (my_sock_init()) {
return -1;
}
if (my_uds_send_msg(sock_s, "eth_s_recv.sock", "Hello world", 11)) {
return -1;
}
while (my_uds_recv_msg(sock_r, data) > 0) {
printf("%s\n", data);
}
my_sock_release();
return 0;
}
编译后执行效果如下