socket套接字

函数原型

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

功能

程序向内核提出创建一个基于内存的套接字描述符,用于网络通信。

参数说明

  1. domain(协议域)

    • 指定通信所使用的协议族(protocol family)。

    • 常见的取值:

      • AF_INETPF_INET:IPv4 互联网协议。

      • AF_INET6PF_INET6:IPv6 互联网协议。

      • AF_UNIXPF_UNIX:本地通信(文件系统套接字)。

      • 其他协议族根据具体需求选择。

  2. type(套接字类型)

    • 指定套接字的通信语义。

    • 常见的取值:

      • SOCK_STREAM:面向连接的字节流套接字(如 TCP)。

      • SOCK_DGRAM:无连接的数据报套接字(如 UDP)。

      • SOCK_RAW:原始套接字(用于自定义协议,如 IP)。

      • SOCK_SEQPACKET:有序分组套接字(较少使用)。

  3. protocol(协议)

    • 指定具体的协议。

    • 通常设置为 0,表示根据 domaintype 参数选择默认协议。

    • 如果需要指定特定协议(如 IPPROTO_TCP、IPPROTO_UDP),可以显式设置。

返回值

  • 成功时返回一个非负整数,表示新创建的套接字描述符。

  • 失败时返回 -1,并设置 errno 错误码。

示例代码(创建 TCP 套接字)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sockfd;
    struct sockaddr_in servaddr;

    // 创建 TCP 套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 配置服务器地址
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定到所有可用地址
    servaddr.sin_port = htons(8080); // 服务端口

    // 绑定套接字到地址
    if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    printf("Socket created and bound successfully.\n");
    close(sockfd);
    return 0;
}

常见错误码

  • EACCES:权限不足,操作不被允许。

  • EAFNOSUPPORT:指定的协议族不支持。

  • EINVAL:无效的参数组合。

  • EMFILE:进程已打开的文件描述符数量达到上限。

  • ENFILE:系统已打开的文件描述符数量达到上限。

  • ENOBUFS:内核内存不足,无法创建套接字。

注意事项

  1. 创建套接字后,需要根据通信类型(服务器或客户端)调用相应的函数(如 bindlistenconnectsendrecv 等)。

  2. 使用完毕后,记得调用 close 函数关闭套接字描述符,释放资源。

  3. 在多线程或并发环境中,套接字描述符需要正确管理,避免资源泄漏或竞争条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值