OpenWrt:libubox之usock

摘自:https://segmentfault.com/a/1190000012086550

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;
}
复制代码

 

posted @   LiuYanYGZ  阅读(899)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2018-12-28 搭建自己的MQTT服务器
2018-12-28 Linux编程实现蜂鸣器演奏康定情歌
2018-12-28 linux c MQTT客户端实现
2016-12-28 最详细的Log4j使用教程
点击右上角即可分享
微信分享提示