unix socket通信的方式

本文介绍了一个基于Unix Socket的通信案例,包括服务器端和客户端的实现。服务器端通过监听指定路径的Unix域套接字接收数据,并调用特定函数处理接收到的数据包;客户端则向服务器发送数据。该示例涵盖了Unix Socket的基本使用方法,如创建套接字、设置选项、绑定地址、发送和接收数据等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unix socket


#include "sys/un.h"
#include "netinet/in.h"
#include "sys/socket.h"
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>
#include "string.h"
#include "pthread.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

#define LISTEN_PATH "/data/test_socket"
static int  listenFd = 0;

int init()
{
    int  rcv_len;
    int on=1;
    struct sockaddr_un servAddr;
    unlink(LISTEN_PATH);
    INFO("init");
    servAddr.sun_family = AF_UNIX;
    strcpy(servAddr.sun_path, LISTEN_PATH);
    if((listenFd = socket(AF_UNIX, SOCK_DGRAM,0)) < 0) {
        INFO("%s", strerror(errno));
        return -1;
    }
    if((setsockopt(listenFd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0) {
        INFO("%s", strerror(errno));
        return -1;
    }
    if(::bind(listenFd, (struct sockaddr*)&servAddr,sizeof(servAddr)) < 0){
        close(listenFd);
        INFO("%s", strerror(errno));
        return -1;
    }
    INFO("listenfd %d",listenFd);
    return 0;
}

bool Start_Server()
{
	init();
	int rcv_len;
	const int BUFSIZE = 1024*1024;
	while(true) {
				char *socket_buf = (char *)malloc(BUFSIZE);
				fd_set rs;
				FD_ZERO(&rs);
				FD_SET(listenFd, &rs);
				int res = select(listenFd + 1, &rs, NULL, NULL, NULL);
				if (FD_ISSET(listenFd, &rs)) {
					if((rcv_len = recvfrom(listenFd, socket_buf, BUFSIZE, 0, NULL, NULL)) > 0) {
						//memcpy(buf, socket_buf, rcv_len);
						INFO( "live_play_add_ts_data------------->>>>>>>>>>>> dataSize = %d\n", rcv_len);
			            int ret = live_play_add_ts_data((unsigned char*)socket_buf,rcv_len);
						free(socket_buf);
						continue;
					}
					INFO("recvfrom waitEvent: %d",listenFd);
				}
    }
    free(socket_buf);
	return true;
}
		


client端的代码是:

#include "sys/un.h"
#include "netinet/in.h"
#include "sys/socket.h"

const char *LOCAL_SOCKET_PATH = "/data/test_socket";

int     local_socket;

int main(int argc, char *argv[])
{

   local_socket = socket(AF_UNIX,SOCK_DGRAM,0);
   if (local_socket < 0) {
	printf("create local socket fail");
   }
	
    struct sockaddr_un servaddr;
    socklen_t socklen = sizeof(struct sockaddr_un);
    memset(&servaddr,0,sizeof(servaddr));

    servaddr.sun_family = AF_UNIX;
    strcpy(servaddr.sun_path, LOCAL_SOCKET_PATH);
	sendto(local_socket, buf, data_len, 0, (struct sockaddr*)&servaddr, socklen);
	

    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值