OpenWrt:libubox之usock

usock即是对网络套接字连接的简单封装。

类型标志:

#define USOCK_TCP 0
#define USOCK_UDP 1
#define USOCK_SERVER          0x0100
#define USOCK_NOCLOEXEC       0x0200
#define USOCK_NONBLOCK        0x0400
#define USOCK_NUMERIC         0x0800
#define USOCK_IPV6ONLY        0x2000
#define USOCK_IPV4ONLY        0x4000
#define USOCK_UNIX            0x8000

接口函数:

/**
 * 创建一个sock
 * 
 * @param type - 类型标志
 * @param host - 作为server表示绑定本地地址;作为client表示需连接的地址
 * @param service - 端口
 * @return - sock fd > 0; 错误 < 0
 */

int usock(int type, const char *host, const char *service);

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>

#include "libubox/usock.h"


int main(int argc, char** argv)
{
    struct sockaddr cli_addr;
    socklen_t len = sizeof(struct sockaddr);
    int type = USOCK_TCP | USOCK_NOCLOEXEC | USOCK_IPV4ONLY;
    const char *host = "127.0.0.1";
    const char *service = "8000";
    char recv_buf[1024] = {0};

    // printf("port: %s\n", usock_port(8888));

    int c_fd = usock(type, host, service);
    if(c_fd < 0) {
        perror("usock");
        return -1;
    }

    send(c_fd, "helloworld", 10, 0);
    sleep(2);
    close(c_fd);

    return 0;
}

服务端代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include "libubox/usock.h"


int main(int argc, char** argv)
{
    struct sockaddr_in cli_addr;
    socklen_t len = sizeof(struct sockaddr);
    int type = USOCK_TCP | USOCK_SERVER | USOCK_NOCLOEXEC | USOCK_IPV4ONLY;
    const char *host = "127.0.0.1";
    const char *service = "8000";
    char recv_buf[1024] = {0};
    int connect_fd, u_fd;

    u_fd = usock(type, host, service);    
    if(u_fd < 0) {
        perror("usock");
        return -1;
    }

    while (1) {
        connect_fd = accept(u_fd, (struct sockaddr *)(&cli_addr), &len);
        if (connect_fd < 0) {
            perror("accept");
            return -1;
        }

        printf("client_addr: %s\n", inet_ntoa(cli_addr.sin_addr));
        recv(connect_fd, recv_buf, 1024, 0);
        printf("recv %s\n", recv_buf);
        close(connect_fd);
    }

    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值