linux开发1-网络编程一之socket

WindowsSocket

STRUCT

struct sockaddr_in

sin_family
sin_port
sin_addr.s_addr

FNCTION

htons

htonl

inet_addr

// 点分十进制IP -> 大端整形
in_addr_t inet_addr (const char *cp);

inet_ntoa

// 大端整形 -> 点分十进制IP
char* inet_ntoa(struct in_addr in);

inet_pton

// 主机字节序的IP地址转换为网络字节序
// 主机字节序的IP地址是字符串, 网络字节序IP地址是整形
int inet_pton(int af, const char *src, void *dst); 
  • af: 地址族 (IP 地址的家族包括 ipv4 和 ipv6) 协议
  1. AF_INET: ipv4 格式的 ip 地址
  2. AF_INET6: ipv6 格式的 ip 地址
  • src: 传入参数,对应要转换的点分十进制的 ip 地址: 192.168.1.100
  • dst: 传出参数,函数调用完成,转换得到的大端整形 IP 被写入到这块内存中
    返回值:成功返回 1,失败返回 0 或者 - 1

inet_ntop

#include <arpa/inet.h>
// 将大端的整形数, 转换为小端的点分十进制的IP地址        
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
  • af: 地址族协议
  1. AF_INET: ipv4 格式的 ip 地址
  2. AF_INET6: ipv6 格式的 ip 地址
  • src: 传入参数,这个指针指向的内存中存储了大端的整形 IP 地址
  • dst: 传出参数,存储转换得到的小端的点分十进制的 IP 地址
  • size: 修饰 dst 参数的,标记 dst 指向的内存中最多可以存储多少个字节

返回值:

成功:指针指向第三个参数对应的内存地址,通过返回值也可以直接取出转换得到的 IP 字符串
失败: NULL

socket

创建网络套接字。

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

参数:

  • domain: 使用的地址族协议
  1. AF_INET: 使用 IPv4 格式的 ip 地址
  2. AF_INET6: 使用 IPv4 格式的 ip 地址
  • type:
  1. SOCK_STREAM: 使用流式的传输协议
  2. SOCK_DGRAM: 使用报式 (报文) 的传输协议
  • protocol: 一般写 0 即可,使用默认的协议
  1. SOCK_STREAM: 流式传输默认使用的是 tcp
  2. SOCK_DGRAM: 报式传输默认使用的 udp
    返回值:
    成功:可用于套接字通信的文件描述符
    失败: -1

setsockopt

bind

int bind(int sockfd,const struct sockaddr *addr,socklent_t addrlen);

给socket绑定一个地址结构。

返回值:成功返回0,失败返回-1。

listen

int listen(int sockfd,int backlog);

sockfd:socket创建的返回值描述符。

backlog:设置监听上限数值,最大值128。

accept

阻塞待待客户端建立连接,成功连接后返回一个与客户端成功连接的socket文件描述符。

int accept(int sockfd,struct sockaddr *addr,socklent_t *addrlen);   //返回值是与客户端成功的文件描述符,失败返回-1。

sockfd:socket创建的文件描述符。

  • addr:输出参数,成功与服务器建立连接的客户端的地址结构。

  • addrlen:输出sockaddr的大小。客户端addr实际大小。

connect

与服务端建立连接。成功返回0,失败返回-1。如果不使用bind绑定客户端地址结构,会采用隐式绑定方式。

int connect(int sockfd,const struct sockaddr *addr,socklent_t addrlen);
  • sockfd:socket文件描述符。
  • addr:传入要连接到的服务端地址结构。
  • addrlen:连接到服务端的地址结构大小。

read

读取数据

write

写发送数据

recvfrom

UDP使用接收数据

// 接收数据, 如果没有数据,该函数阻塞
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd: 基于 udp 的通信的文件描述符
  • buf: 指针指向的地址用来存储接收的数据
  • len: buf 指针指向的内存的容量,最多能存储多少字节
  • flags: 设置套接字属性,一般使用默认属性,指定为 0 即可
  • src_addr: 发送数据的一端的地址信息,IP 和端口都存储在这里边,是大端存储的
    如果这个参数中的信息对当前业务处理没有用处,可以指定为 NULL, 不保存这些信息
  • addrlen: 类似于 accept () 函数的最后一个参数,是一个传入传出参数
    传入的是 src_addr 参数指向的内存的大小,传出的也是这块内存的大小
    如果 src_addr 参数指定为 NULL, 这个参数也指定为 NULL 即可
    返回值:成功返回接收的字节数,失败返回 - 1

close

close(fd)   //关闭套接字
posted @   alvinlyb  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示