零基础入门Linux网络编程:C 语言网络高级编程函数解析与示例

在 C 语言网络编程中,除了基础的 socketbindlistenacceptconnectsendrecv 之外,还有许多高级函数用于更高效地管理网络通信。本文将介绍 fcntlgetpeernamegetsocknamegetsockoptioctlreadsocketpairwritegetprotoent 以及 selectpollepoll 等重要函数,并提供示例代码。

1. 高级网络编程函数概述

函数名作用
fcntl控制文件描述符的属性,如非阻塞模式
getpeername获取已连接套接字的对端地址
getsockname获取本地套接字地址
getsockopt获取套接字选项
setsockopt设置套接字选项,如超时、缓冲区大小等
ioctl设备控制,如设置非阻塞模式
read / write直接对套接字进行读写
socketpair创建一对相互连接的套接字
getprotoent获取协议信息
recvmmsg / sendmmsg批量接收/发送多个消息
cmsg发送和接收辅助数据
sockatmark检测带外数据
sendfile在文件和套接字之间高效传输数据
select监听多个文件描述符,等待可读/可写事件
poll类似 select,但支持更多事件
epoll高效管理多个文件描述符的事件
address_families介绍地址族,如 AF_INETAF_INET6
ip / ipv6解析 IP 层协议
tcp / udp解析 TCP/UDP 传输层协议
unix解析 Unix 域套接字

2. 示例代码

2.1 fcntl 设置非阻塞模式

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>

void set_nonblocking(int sockfd) {
    int flags = fcntl(sockfd, F_GETFL, 0);
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
}

2.2 getpeername 获取对端地址

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

void print_peer_info(int sockfd) {
    struct sockaddr_in addr;
    socklen_t addr_len = sizeof(addr);
    getpeername(sockfd, (struct sockaddr*)&addr, &addr_len);
    printf("Connected to %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
}

2.3 getsockopt 获取缓冲区大小

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

void print_recv_buffer_size(int sockfd) {
    int size;
    socklen_t len = sizeof(size);
    getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, &len);
    printf("Receive buffer size: %d bytes\n", size);
}

2.4 sendfile 发送文件

#include <sys/sendfile.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>

void send_file(int sockfd, const char *filename) {
    int filefd = open(filename, O_RDONLY);
    off_t offset = 0;
    struct stat stat_buf;
    fstat(filefd, &stat_buf);
    sendfile(sockfd, filefd, &offset, stat_buf.st_size);
    close(filefd);
}

2.5 epoll 监听多个套接字

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

void monitor_sockets(int sockfd1, int sockfd2) {
    int epfd = epoll_create1(0);
    struct epoll_event ev1 = {.events = EPOLLIN, .data.fd = sockfd1};
    struct epoll_event ev2 = {.events = EPOLLIN, .data.fd = sockfd2};
    epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd1, &ev1);
    epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd2, &ev2);
    
    struct epoll_event events[2];
    int nfds = epoll_wait(epfd, events, 2, -1);
    for (int i = 0; i < nfds; i++) {
        printf("Socket %d is ready to read\n", events[i].data.fd);
    }
    close(epfd);
}

3. 结论

本文介绍了 C 语言高级网络编程中常用的函数,并提供了相应示例代码。不同函数在不同场景下发挥作用,比如 fcntl 设置非阻塞、getsockopt 获取选项、epoll 监听多个连接等。掌握这些函数有助于编写更高效的网络应用。


更多详细信息,可以参考 Linux 手册

如果你有任何问题或建议,欢迎留言讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银河码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值