以下是 Socket API 的核心文档摘要(基于 POSIX标准 和 Linux/Unix系统),涵盖关键函数、参数及简单示例:
1. 核心函数
(1) socket()
- 创建套接字
#include <sys/socket.h>
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
(自动选择)。
- 返回值:成功返回文件描述符,失败返回
-1
。
(2) bind()
- 绑定地址
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 参数:
sockfd
:socket()
返回的描述符。addr
: 指向包含IP和端口的结构体(如struct sockaddr_in
)。addrlen
: 地址结构体大小。
(3) listen()
- TCP监听连接
int listen(int sockfd, int backlog);
- backlog: 等待连接队列的最大长度。
(4) accept()
- TCP接受连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- 返回值: 新的连接描述符(用于数据传输)。
(5) connect()
- TCP/UDP连接服务器
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(6) UDP专用: sendto()/recvfrom()
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
2. IP地址处理
(1) IPv4地址结构 (sockaddr_in
)
#include <netinet/in.h>
struct sockaddr_in {
sa_family_t sin_family; // AF_INET
in_port_t sin_port; // Port (网络字节序)
struct in_addr sin_addr; // IP地址
};
struct in_addr {
uint32_t s_addr; // IPv4地址(32位整数)
};
(2) IP转换函数
// 字符串IP → 二进制(如 "192.168.1.1" → in_addr)
int inet_pton(int af, const char *src, void *dst);
// 二进制IP → 字符串
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
3. TCP服务端示例代码
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(8080); //端口号转换为网络字节序
addr.sin_addr.s_addr = INADDR_ANY; //监听所有网卡
bind(server_fd,(structsockadd*)&addrsizeof(adr));
listen(server_fd10);
while(1){
int client_fd=accept(...);
send(client_fd,"Hello",5 ,0 );
close(client_fd);
}
}
4. UDP客户端示例代码片段
#include<stdio .h>
#include<unist d .h>
main(){
int fd=socket(AF_INETSOCK_DGRAM ,0);
structs ockadd r_i n serv_adr={
.sin _family=AF _IN ET ,
.sin _port=htons(53), //DNS默认端口
.sin _ad dr.s _ad dr=inet_pton("8 .8 .8 .8")};
sendto(fdbufferstrle n(buffer ),0 ,&serv_adrsizeof(serv_adr));
}
如果需要更详细的文档或具体场景的代码实现,可以参考:
- Linux手册页命令:
man socket
- Beej’s Guide to Network Programming (经典网络编程指南)
内容由零声教学AI助手提供,问题来源于学员提问