socket网络编程
Socket是什么?
Socket = 网络插座
- 就像电源插座连接电器和电网
- Socket连接应用程序和网络
- 是操作系统提供的网络编程接口
// Socket编程的核心思想:// 服务器:创建Socket → 绑定地址 → 监听 → 接受连接// 客户端:创建Socket → 连接服务器 → 通信
Socket 编程流程(TCP)
套接字可以通过网络收发数据
服务器端
创建套接字 通信端点(socket())
int socket(int domain, int type, int protocol);
domain: AF_INET(IPv4), AF_INET6(IPv6) AF_UNIX(本地套接字
type: SOCK_STREAM(TCP), SOCK_DGRAM(UDP)
protocol: 协议 通常填0(自动选择)
返回值:成功返回套接字描述符(int),失败返回 -1
绑定 IP 和端口(bind())
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
将socket与特定IP和端口绑定
sockfd:socket() 返回的套接字描述符
addr:指向本地地址结构的指针(IPv4 用 struct sockaddr_in)
addrlen:地址结构长度
返回值:成功 0,失败 -1
监听连接(listen())
int listen(int sockfd, int backlog);
sockfd:套接字描述符
backlog:最大等待连接队列长度
返回值:成功 0,失败 -1
接受连接(accept())
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 阻塞等待客户端连接,返回新的socket用于通信
sockfd:监听套接字描述符
addr:用于返回客户端地址
addrlen:传入地址长度,返回实际长度
返回值:成功返回新的连接套接字描述符,失败 -1
收发数据(read()/write() 或 recv()/send())
// 与文件IO相同的函数,用于网络数据传输
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
sockfd:连接套接字
buf:数据缓冲区
len:数据长度
flags:通常为 0
返回值:成功返回实际收发的字节数,失败 -1
关闭连接(close())
int close(int fd); fd:套接字描述符 返回值:成功 0,失败 -1
客户端
创建套接字(socket())
连接服务器(connect())
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd:套接字描述符
addr:服务器地址结构
addrlen:地址长度
返回值:成功 0,失败 -1
收发数据(read()/write() 或 recv()/send())
关闭连接(close())
socket地址结构
#include <sys/socket.h>
#include <netinet/in.h>
IPv4地址结构
struct sockaddr_in {
sa_family_t sin_family; 地址族:AF_INET
in_port_t sin_port; 端口号(16位)
struct in_addr sin_addr; IP地址(32位)
};
struct in_addr {
uint32_t s_addr; 网络字节序的IP地址
};