全部文档
OneOS简介 硬件支持 编译构造工具 API参考文档 高级语言 用户编程手册 应用笔记 FAQ

套接字组件(Socket)


简介

套接字组件为用户提供了一套兼容BSD的标准接口,用来实现网络连接及数据传输,下层涵盖了以太模块、蜂窝模组等不同制式的通信介质以及不同的通信协议栈。

API列表

Socket组件采用的是BSD的标准套接字API,本文只截取部分常用接口作简要介绍,完整的API说明可参考相关文档。

接口 说明
socket 创建套接字
bind 绑定ip和端口到套接字
listen 监听套接字
connect 连接到服务器
accept 接受socket连接请求
send 发送数据
sendto 可用于发送UDP数据
recv 接收数据
recvfrom 可用于接收UDP数据
closesocket 关闭套接字
getsockopt 获取套接字属性
setsockopt 设置套接字属性

socket

该函数用于创建一个套接字,其函数原型如下:

int socket(int domain, int type, int protocol);
参数 说明
domain 地址类型,AF_INET(IPV4)或AF_INET6(IPV6)
type 套接字类型,常见有TCP(SOCK_STREAM)、UDP(SOCK_DGRAM)等
protocol 传输协议
返回 说明
int 成功:套接字id,失败:-1

bind

该函数用于将一个ip和端口绑定到套接字上,其函数原型如下:

int bind(int s, const struct sockaddr *name, socklen_t namelen);
参数 说明
s 套接字id
name 欲绑定地址信息
namelen sockaddr结构体长度
返回 说明
0 成功
非0 失败

listen

该函数用于在指定的套接字上监听连接,函数原型如下:

int listen(int s, int backlog);
参数 说明
s 待连接的套接字
backlog 允许的最大连接数
返回 说明
0 成功
非0 失败

connect

该函数用于建立与指定套接字的连接,函数原型如下:

int connect(int s, const struct sockaddr *name, socklen_t namelen);
参数 说明
s 待连接的套接字
name 欲连接地址信息
namelen sockaddr结构体长度
返回 说明
OS_EOK 成功
非OS_EOK 失败

accept

该函数用于在指定套接字等待接受连接,其函数原型如下:

os_err_t accept(int s, struct sockaddr *addr, socklen_t *addrlen);
参数 说明
s 等待被连接的套接字
addr 接收连接地址信息
addrlen sockaddr结构体长度
返回 说明
OS_EOK 成功
非OS_EOK 失败

send

该函数用于向已连接套接字发送数据,其函数原型如下:

int send(int s, const void *dataptr, size_t size, int flags);
参数 说明
s 已连接的套接字
dataptr 待发送数据
size 数据大小
flags 标识,一般为0
返回 说明
OS_EOK 成功
非OS_EOK 失败

sendto

该函数用于向指定目的地发送数据,故可用于发送UDP数据,其函数原型如下:

int sendto(int                      s, 
           const void              *dataptr, 
           size_t                   size, 
           int                      flags,
           const struct sockaddr   *to, 
           socklen_t                tolen);
参数 说明
s 与指定目的地绑定的套接字
dataptr 待发送数据
size 数据大小
flags 标识,一般为0
to 目的地址
tolen sockaddr结构体长度
返回 说明
OS_EOK 成功
非OS_EOK 失败

recv

该函数用于设置网关,其函数原型如下:

int recv(int s, void *mem, size_t len, int flags);
参数 说明
s 已连接套接字
mem 接收buffer
len buffer长度
flags 标识,一般为0
返回 说明
OS_EOK 响应消息体指针
非OS_EOK 失败

recvfrom

该函数用于设置dns服务器,该函数原型如下:

int recvfrom(int              s, 
             void            *mem, 
             size_t           len, 
             int              flags,
             struct sockaddr *from, 
             socklen_t       *fromlen);
参数 说明
s 已连接套接字
mem 接收buffer
len buffer长度
flags 标识,一般为0
from 接收数据远端地址
fromlen sockaddr结构体长度
返回 说明
OS_EOK 成功
非OS_EOK 失败

closesocket

该函数用于关闭指定套接字,该函数原型如下:

int closesocket(int s);
参数 说明
s 欲关闭套接字
返回 说明
OS_EOK 成功
非OS_EOK 失败

getsockopt

该函数用于获取指定套接字的属性,该函数原型如下:

int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);
参数 说明
s 套接字
level 选项定义的层次,SOL_SOCKET或IPPROTO_TCP
optname 欲获取配置的名称
optval 存放配置buffer
optlen buffer大小
返回 说明
OS_EOK 成功
非OS_EOK 失败

setsockopt

该函数用于设置指定套接字的属性,该函数原型如下:

int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
参数 说明
s 套接字
level 选项定义的层次,SOL_SOCKET或IPPROTO_TCP
optname 欲设置配置的名称
optval 欲配置选项值
optlen 配置大小
返回 说明
OS_EOK 成功
非OS_EOK 失败

使用示例

#include <arpa/inet.h>
#include <netdb.h>
#include <os_kernel.h>
#include <os_errno.h>
#include <shell.h>
#include <string.h>
#include <sys/socket.h>

int socket_sample()
{
    int                ret;
    int                sock = -1;
    int                data_len;
    char              *buf;
    struct hostent    *host;
    struct sockaddr_in server_addr;
    const char        *data = "Hello CMCC OneOS!";
    const char        *url = "xxx.xxx.xxx.xxx"; /* fix while debug */
    os_uint32_t        port = 9999;             /* fix while debug */

    host = gethostbyname(url);
    buf = malloc(128);
    if (OS_NULL == buf)
    {
        os_kprintf("malloc failed!\n");
        return OS_ERROR;
    }

    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        os_kprintf("socket failed!\n");
        os_free(buf);
        return OS_ERROR;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr = *((struct in_addr *)host->h_addr);
    memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

    if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) != 0)
    {
        os_kprintf("connect failed!\n");
        os_free(buf);
        return OS_ERROR;
    }

    while (1)
    {
        os_task_delay(os_tick_from_ms(5000));
        ret = send(sock, data, strlen(data), 0);
        if (ret < 0)
        {
            closesocket(sock);
            os_free(buf);
            break;
        }

        data_len = recv(sock, buf, 128, 0);
        if (data_len <= 0)
        {
            closesocket(sock);
            os_free(buf);
            break;
        }
        buf[data_len] = 0;
        os_kprintf("recv data: %s\n", buf);
    }

    return OS_EOK;
}

results matching ""

    No results matching ""

    返回顶部