15. 网络编程 - <sys/socket.h>
和 <netinet/in.h>
网络编程在C语言中是通过套接字来实现的,套接字提供了进程间通信的端点。C语言的网络编程涉及到创建套接字、绑定地址、监听和接收数据。以下是网络编程的关键概念和基本实现方法。
15.1. 套接字基础
15.1.1. 套接字类型与协议
套接字是网络通信的基础,它分为不同的类型和协议:
-
套接字类型:
- 流套接字(
SOCK_STREAM
):基于TCP协议,提供可靠的双向字节流通信。 - 数据报套接字(
SOCK_DGRAM
):基于UDP协议,无连接,面向消息,通信时不保证消息顺序和完整性。
- 流套接字(
-
协议:
- TCP(传输控制协议):提供可靠、有序的字节流服务,比如HTTP。
- UDP(用户数据报协议):提供较低效能的、不可靠的数据报服务,比如DNS查询。
15.1.2. 创建和绑定套接字:socket
, bind
创建套接字并绑定到指定IP和端口是建立网络服务的基础步骤。
-
socket
函数:用于创建一个新的套接字。int socket(int domain, int type, int protocol);
domain
:地址族,一般为AF_INET
(IPv4)或AF_INET6
(IPv6)。type
:套接字类型,如SOCK_STREAM
(TCP)或SOCK_DGRAM
(UDP)。protocol
:通常设为0
,自动匹配。
-
bind
函数:将套接字与特定IP地址和端口绑定。int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd
:由socket
返回的文件描述符。addr
:IP地址和端口信息结构体,通常为struct sockaddr_in
。addrlen
:地址结构体的长度。
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
int main() {
int sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建套接字 [1]
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));</