域套接字代码示例(2)

下面是使用域套接字进行进程间通信的典型代码。

客户端代码:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h> 
#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        cout << "usage: " << argv[1] << " message" << endl;
        return -1;
    }

    int iSockFd = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (iSockFd < 0)
    {
        cerr << "fail to create socket" << endl;
        return -1;
    }

    sockaddr_un oAddr;
    memset(&oAddr, 0, sizeof(oAddr));
    oAddr.sun_family = AF_UNIX;
    strncpy(oAddr.sun_path, tmpnam(NULL), sizeof(oAddr.sun_path) - 1);
    if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < 0)
    {
        cerr << "fail to bind" << endl;
        return -1;
    }

    sockaddr_un oSvrAddr;
    memset(&oSvrAddr, 0, sizeof(oSvrAddr));
    oSvrAddr.sun_family = AF_UNIX;
    strncpy(oSvrAddr.sun_path, "unix_socket", sizeof(oSvrAddr.sun_path) - 1);

    sendto(iSockFd, argv[1], strlen(argv[1]), 0, (sockaddr *)&oSvrAddr, sizeof(oSvrAddr));
    
    socklen_t iAddrLen = sizeof(oSvrAddr);
    char acRecvBuf[100];
    ssize_t iRecvLen = recvfrom(iSockFd, acRecvBuf, sizeof(acRecvBuf), 0, (sockaddr *)&oSvrAddr, &iAddrLen);
    if (iRecvLen < 0)
    {
        cerr << "fail to recv" << endl;
        return -1;
    }
    acRecvBuf[iRecvLen] = 0;
    cout << "client recv: " << acRecvBuf << endl;

    return 0;
}

服务器代码:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h> 
#include <iostream>

using namespace std;

int main()
{
    int iSockFd = socket(AF_UNIX, SOCK_DGRAM, 0);
    if (iSockFd < 0)
    {
        cerr << "fail to create socket" << endl;
        return -1;
    }

    unlink("unix_socket");
    sockaddr_un oAddr;
    memset(&oAddr, 0, sizeof(oAddr));
    oAddr.sun_family = AF_UNIX;
    strcpy(oAddr.sun_path, "unix_socket");

    if (bind(iSockFd, (sockaddr *)&oAddr, sizeof(oAddr)) < 0)
    {
        cerr << "fail to bind" << endl;
        return -1;
    }

    sockaddr_un oClientAddr;
    char acBuf[100];
    while (true)
    {
        socklen_t iAddrLen = sizeof(oClientAddr);
        ssize_t iRecvLen = recvfrom(iSockFd, acBuf, sizeof(acBuf), 0, (sockaddr *)&oClientAddr, &iAddrLen);
        if (iRecvLen < 0)
        {
            cerr << "fail to recv" << endl;
            continue;
        }
        acBuf[iRecvLen] = 0;
        cout << "server recv: " << acBuf << ", client addr: " << oClientAddr.sun_path << endl;
        sendto(iSockFd, acBuf, iRecvLen, 0, (sockaddr *)&oClientAddr, iAddrLen);
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/glacierh/p/5080497.html

libevent是一个高性能的事件驱动网络库,它可以帮助开发者高效地监控网络连接(包括TCP、UDP套接字)以及其他类型的I/O操作,如定时器等。当指定的事件发生时,libevent会自动触发回调函数,从而让应用程序能够作出相应的处理。 在使用libevent监控套接字时,通常步骤如下: 1. 初始化libevent环境和事件结构体。 2. 创建监听socket,并注册到libevent的事件循环中。 3. 当有新的连接到来或数据到达时,事件会被添加到事件循环中等待。 4. 在事件循环中,通过`evutil_socket_accept()`接收新连接,或者通过`evbuffer_read()`读取数据。 5. 编写回调函数,处理这些事件,例如创建新线程处理新连接,或者解析和响应数据。 以下是一个简单的libevent代码示例(C语言),展示了如何创建一个基础的TCP服务器监听端口并处理连接请求: ```c #include <event2/event.h> #include <event2/bufferevent.h> struct evconnlistener *listener; struct bufferevent *bev; void on_connection(bufferevent * bev, short events) { // 新连接进来,这里可以创建一个新的bufferevent用于客户端通信 struct bufferevent *new_bev = bufferevent_new(bufferevent_get_base(bev), handle_data); bufferevent_setwatermark(new_bev, EV_READ, 0, BUFSIZ); // 设置读水印 bufferevent_setcb(new_bev, NULL, NULL, on_close, bev); // 回调处理 bufferevent_accept(bev, new_bev); // 接收客户端连接 } void handle_data(bufferevent * bev, const char *data, int len) { // 数据处理,这里只是一个示例,实际应用中根据需要处理 printf("Received data: %.*s\n", len, data); } int main() { event_base *base = event_base_new(); listener = event_listener_new(base, -1, EV_READ | EV_PERSIST, on_connection, NULL); sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(8080); // 监听端口号 if (bind(listener->listener_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind failed"); return 1; } if (listen(listener->listener_fd, 5) < 0) { perror("listen failed"); return 1; } event_add(listener->listener_fd, NULL); // 将监听套接字添加到事件循环 event_base_dispatch(base); // 开始事件循环 event_base_free(base); return 0; } ``` 请注意,这只是一个基本的示例,实际项目中还需要考虑错误处理和其他细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值