第五章 Linux网络编程基础API

devtools/2025/2/6 20:26:10/

在网络编程中,“网络字节序”(Network Byte Order)指的是一种统一的字节排列方式,即大端字节序(Big-Endian),用于在网络上传输数据。这样做的目的是确保不同主机之间(可能采用不同的字节序)能够正确地解析数据。

#include <stdio.h>

void byteorder()

{

 union{

        short value;

        char union_bytes[sizeof(short)];

}test;

test.value = 0x0102;

if( ( test.union_bytes[0] == 1 && test.union_bytes[1] == 2)

{

        printf("big endian\n");
}else if( test.union_bytes[0] == 2 && test.union_bytes[1] == 1){
printf("little endian\n");
}else{

printf("unknown...\n");
}

IP地址转换函数

struct in_addr

{

        u_int32_t s_addr;
}

#include <arpa/inet.h>

int_addr_t inet_addr(const char* strptr);

int inet_aton(const char* cp,struct in_addr* inp);

char* inet_ntoa(struct in_addr in); // 不可重入

int inet_pton(int af, const char* src, void * dst);

const char* inet_ntop(int af, const void* src,char *dst,socklen_t cnt);

// 以上涉及的ip 地址的数字表示都是网络字节序

struct in_addr addr;

addr.s_addr = inet_addr("192.168.1.1");

char ip_str[INET_ADDRSTRLEN]; // 通常为 16 字节

if (inet_ntop(AF_INET, &addr, ip_str, INET_ADDRSTRLEN) != NULL)

{ printf("IP地址为: %s\n", ip_str); } else { perror("inet_ntop"); }

#include <stdio.h>
#include <arpa/inet.h>

int main() {
    const char *ip_str = "192.168.1.1";  // 待转换的 IPv4 地址字符串
    struct in_addr addr;

    // 使用 inet_pton 进行转换
    // AF_INET 表示 IPv4,&addr 是存放转换结果的地址
    int result = inet_pton(AF_INET, ip_str, &addr);
    if (result == 1) {
        // 转换成功,addr.s_addr 存放的是网络字节序的地址
        printf("IPv4地址转换成功!\n");
        printf("网络字节序的地址值:0x%x\n", addr.s_addr);
    } else if (result == 0) {
        // 输入的地址字符串格式不正确
        fprintf(stderr, "无效的IPv4地址格式: %s\n", ip_str);
        return 1;
    } else {
        // 转换过程中出现错误
        perror("inet_pton");
        return 1;
    }

    return 0;
}
 

1.创建socket

#include <sys/types.h>

#include <sys/socket.h>

int socket(int domain, int type, int protocol);// 失败返回-1 并设置errno

domain: PF_INET (IPV4) 或者 PF_INET6(IPV6)对于unix 本地域协议族为PF_UNIX

type 指定服务类型      SOCK_STREAM(流服务)表示传输层使用TCP协议

SOCK_DGRAM (数据报服务)表示传输层使用udp协议

protocol 通常为0

2.命名socket

#include <sys/types.h>

#inclulde <sys/socket.h>

int bind(int sockfd,const struct sockaddr* my_addr,socklen_t addrlen);

bind 将my_addr所指的socket 地址分配给未命名的sockfd文件描述符,addrlen参数指出该sockaddr的长度

3.监听socket

#include <sys/socket.h>

int listen(int sockfd, int backlog);

sockfd 参数指定被监听的socket, backlog 参数提示内核监听队列的最大长度。

4.接受连接

#include <sys/types.h>

#include <sys/socket.h>

int accept(int sockfd, struct sockaddr* addr, socklen_t * addrlen);

sockfd 参数是执行过listen 系统调用的监听socket。addr 参数用来获取被接受连接的远端socket地址,该sockaddr 参数的长度由addrlen 参数指出

accetp 失败返回-1  并设置errno

5.发起连接

#include <sys/types.h>

#include <sys/socket.h>

int connect( int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);

sockfd 参数由socket系统调用返回一个socket,serv_addr 参数是服务器监听的socket地址,addrlen参数指定sockaddr 的长度。

connect 成功返回0,一旦成功建立连接,sockfd 就唯一标识了这个连接,客户端可以通过读写sockfd来与服务器通信。connect失败返回-1并设置errno 

6.关闭连接

#include <unistd.h>

int close(int fd);

close 并不是直接关闭对应的fd 连接,而是将fd的引用计数减1.只有当fd的引用计数为0时,才可以真正关闭socket。一次fork系统调用默认将使父进程中打开的socket的引用加1,必须在子进程和父进程中都对socket执行close调用才能将连接关闭。

如果要立即关闭可以使用shutdown

#include <sys/socket.h>

int shutdown(int sockfd, int howto);

sockfd 是待关闭的socket  howto 决定了shutdown的行为

SHUT_RD   应用程序不可以再对sockfd进行读操作

SHUT_WR  不可以写操作

SHUT_RDWR 同事关闭读写

成功返回0失败返回-1并设置errno


http://www.ppmy.cn/devtools/156610.html

相关文章

剑指offer 字符串 持续更新中...

文章目录 1. 替换空格1.1 题目描述1.2 从前向后替换空格1.3 从后向前替换空格 持续更新中… 1. 替换空格 替换空格 1.1 题目描述 题目描述&#xff1a;将一个字符串s中的每个空格替换成“%20”。 示例&#xff1a; 输入&#xff1a;"We Are Happy" 返回&#xf…

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

入行FPGA设计工程师需要提前学习哪些内容?

FPGA作为一种灵活可编程的硬件平台&#xff0c;广泛应用于嵌入式系统、通信、数据处理等领域。很多人选择转行FPGA设计工程师&#xff0c;但对于新手来说&#xff0c;可能在学习过程中会遇到一些迷茫和困惑。为了帮助大家更好地准备&#xff0c;本文将详细介绍入行FPGA设计工程…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测&#xff0c;到2025年全球 AI 安全解决方案市场规模将突破200亿美元&#xff0c;年复合增长率超过30%&#xff0c;而Gartn…

python 使用Whisper模型进行语音翻译

目录 一、Whisper 是什么? 二、Whisper 的基本命令行用法 三、代码实践 四、是否保留Token标记 五、翻译长度问题 六、性能分析 一、Whisper 是什么? Whisper 是由 OpenAI 开源的一个自动语音识别(Automatic Speech Recognition, ASR)系统。它的主要特点是: 多语言…

Resnet 改进:尝试在不同位置加入Transform模块

目录 1. TransformerBlock 2. resnet 3. 替换部分卷积层 4. 在特定位置插入Transformer模块 5. 使用Transformer全局特征提取器 6. 其他 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. TransformerBlock TransformerBlock是Transfo…

Mybatis之常用动态Sql语句

数据库结构、实体类 public class Youth {private Integer id;private String username;private Date birthday;private Character sex;private String address;private Integer age;public Youth(Integer id, String username, Date birthday, Character sex, String address)…

深入核心:一步步手撕Tomcat搭建自己的Web服务器

介绍&#xff1a; servlet&#xff1a;处理 http 请求 tomcat&#xff1a;服务器 Servlet servlet 接口&#xff1a; 定义 Servlet 声明周期初始化&#xff1a;init服务&#xff1a;service销毁&#xff1a;destory 继承链&#xff1a; Tomcat Tomcat 和 servlet 原理&#x…