无锡本地网站有哪些,wordpress手机端如何使用,合肥在线,西安在线目录
一、网络编程基础概念与原理
1.1 套接字#xff08;Socket#xff09;
1.2 IP地址和端口
1.3 TCP/IP协议
二、C网络编程核心技术
2.1 套接字编程
2.1.1 创建套接字
2.1.2 绑定地址
2.1.3 监听和接受连接
2.1.4 发送和接收数据
三、C网络编程高级技术
3.1 异…
目录
一、网络编程基础概念与原理
1.1 套接字Socket
1.2 IP地址和端口
1.3 TCP/IP协议
二、C网络编程核心技术
2.1 套接字编程
2.1.1 创建套接字
2.1.2 绑定地址
2.1.3 监听和接受连接
2.1.4 发送和接收数据
三、C网络编程高级技术
3.1 异步I/O
3.2 多线程网络编程
3.3 Boost.Asio库
运行结果
总结 网络编程是现代软件开发的重要组成部分尤其在开发分布式系统、客户端-服务器应用以及互联网应用时尤为关键。C作为一门强大且高效的编程语言在网络编程中也有广泛应用。本文将深入阐述C网络编程的概念、原理、本质及需要掌握的核心技术并通过经典实例进行详细讲解。
一、网络编程基础概念与原理
1.1 套接字Socket
概念套接字是网络编程中的基本抽象用于描述网络连接的端点。它本质上是一个文件描述符用于在网络中进行数据传输。
原理套接字提供了应用层与传输层之间的接口使得操作系统能够管理网络通信。套接字API包括创建、绑定、监听、连接、发送和接收数据等操作。
核心点
Socket类型常见的有流套接字SOCK_STREAM和数据报套接字SOCK_DGRAM分别对应TCP和UDP协议。Socket地址包含IP地址和端口号用于标识网络中的设备和应用。
1.2 IP地址和端口
IP地址标识网络中的主机例如IPv4如192.168.1.1和IPv6如2001:db8::1地址。
端口号标识主机上的应用程序范围为0到65535。常见的端口号如HTTP的80端口、HTTPS的443端口等。
1.3 TCP/IP协议
概念TCP/IP协议族是互联网的基础协议包含传输层的TCP和UDP、网络层的IP等。
原理
TCP提供可靠的字节流服务包括连接建立、数据传输、连接终止等过程。TCP通过三次握手建立连接四次挥手终止连接。UDP提供不可靠的消息传递服务数据报可能无序到达或丢失。UDP适用于实时性要求较高的应用如视频传输、在线游戏等。
二、C网络编程核心技术
2.1 套接字编程
2.1.1 创建套接字
int sockfd socket(AF_INET, SOCK_STREAM, 0);
if (sockfd 0) {perror(socket creation failed);exit(EXIT_FAILURE);
}解析
socket(AF_INET, SOCK_STREAM, 0)创建一个TCP套接字。AF_INET表示使用IPv4SOCK_STREAM表示使用TCP协议。返回值成功时返回套接字文件描述符失败时返回-1。
2.1.2 绑定地址
struct sockaddr_in server_addr;
memset(server_addr, 0, sizeof(server_addr));
server_addr.sin_family AF_INET;
server_addr.sin_addr.s_addr INADDR_ANY;
server_addr.sin_port htons(PORT);if (bind(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)) 0) {perror(bind failed);close(sockfd);exit(EXIT_FAILURE);
}解析
struct sockaddr_in定义IP地址和端口sin_family设为AF_INETsin_addr.s_addr设为INADDR_ANY表示接受任何IP地址sin_port设为端口通过htons函数转换为网络字节序。bind将地址绑定到套接字。
2.1.3 监听和接受连接
if (listen(sockfd, 5) 0) {perror(listen failed);close(sockfd);exit(EXIT_FAILURE);
}struct sockaddr_in client_addr;
socklen_t client_len sizeof(client_addr);
int newsockfd accept(sockfd, (struct sockaddr*)client_addr, client_len);
if (newsockfd 0) {perror(accept failed);close(sockfd);exit(EXIT_FAILURE);
}解析
listen将套接字置于监听模式准备接受连接。第二个参数为连接队列的最大长度。accept接受客户端连接返回新的套接字用于通信。client_addr保存客户端地址信息。
2.1.4 发送和接收数据
const char* message Hello, Client!;
send(newsockfd, message, strlen(message), 0);char buffer[1024];
int n recv(newsockfd, buffer, sizeof(buffer), 0);
buffer[n] \0;
printf(Received: %s\n, buffer);解析
send发送数据第四个参数为标志位通常为0。recv接收数据返回接收的字节数。
三、C网络编程高级技术
3.1 异步I/O
概念异步I/O允许程序在等待I/O操作完成时继续执行其他任务提高程序的并发性能。
实现方式
多线程每个I/O操作分配一个线程处理。事件驱动使用事件循环处理I/O事件例如select、poll、epoll等。
3.2 多线程网络编程
核心点
线程同步避免多个线程同时访问共享资源使用互斥锁、条件变量等。线程池复用线程减少线程创建和销毁的开销提高性能。
实例使用线程池处理多个客户端连接。
#include iostream
#include thread
#include vector
#include mutex
#include condition_variable
#include queue
#include sys/socket.h
#include netinet/in.h
#include unistd.h#define PORT 8080std::mutex mtx; // 互斥锁用于保护共享资源
std::condition_variable cv; // 条件变量用于线程间同步
std::queueint clients; // 用于存储待处理的客户端套接字// 处理客户端连接的函数
void handle_client(int client_sock) {char buffer[1024];int n recv(client_sock, buffer, sizeof(buffer), 0); // 接收客户端消息if (n 0) {buffer[n] \0; // 添加字符串终止符std::cout Received: buffer std::endl;const char* response Message received;send(client_sock, response, strlen(response), 0); // 发送响应给客户端}close(client_sock); // 关闭客户端连接
}// 工作线程函数用于处理客户端连接
void worker() {while (true) {int client_sock;{std::unique_lockstd::mutex lock(mtx); // 获取锁cv.wait(lock, [] { return !clients.empty(); }); // 等待条件变量通知client_sock clients.front(); // 从队列中取出客户端套接字clients.pop(); // 移除队列中的套接字}handle_client(client_sock); // 处理客户端连接}
}int main() {int server_sock socket(AF_INET, SOCK_STREAM, 0); // 创建TCP套接字if (server_sock 0) {perror(socket creation failed);exit(EXIT_FAILURE);}struct sockaddr_in server_addr;memset(server_addr, 0, sizeof(server_addr));server_addr.sin_family AF_INET; // 使用IPv4server_addr.sin_addr.s_addr INADDR_ANY; // 绑定所有可用的网络接口server_addr.sin_port htons(PORT); // 绑定端口if (bind(server_sock, (struct sockaddr*)server_addr, sizeof(server_addr)) 0) {perror(bind failed);close(server_sock);exit(EXIT_FAILURE);}if (listen(server_sock, 5) 0) { // 设置监听队列的最大长度为5perror(listen failed);close(server_sock);exit(EXIT_FAILURE);}// 创建多个工作线程std::vectorstd::thread workers;for (int i 0; i 4; i) {workers.emplace_back(worker); // 启动工作线程}while (true) {struct sockaddr_in client_addr;socklen_t client_len sizeof(client_addr);int client_sock accept(server_sock, (struct sockaddr*)client_addr, client_len); // 接受客户端连接if (client_sock 0) {perror(accept failed);continue;}{std::lock_guardstd::mutex lock(mtx); // 获取锁clients.push(client_sock); // 将客户端套接字添加到队列中}cv.notify_one(); // 通知一个工作线程}for (auto t : workers) {t.join(); // 等待所有工作线程结束}close(server_sock); // 关闭服务器套接字return 0;
}解析
线程池创建多个工作线程等待处理客户端连接。同步机制使用互斥锁和条件变量同步对客户端队列的访问。
3.3 Boost.Asio库
概念Boost.Asio是一个高效的C网络编程库提供了同步和异步I/O操作支持多平台。
核心点
I/O对象如ip::tcp::socket、ip::udp::socket等。I/O操作如async_read、async_write等支持异步操作。事件循环通过io_context管理异步操作。
实例使用Boost.Asio实现异步TCP服务器。
#include boost/asio.hpp
#include iostream
#include memory
#include utilityusing boost::asio::ip::tcp;// 会话类用于管理单个客户端连接
class Session : public std::enable_shared_from_thisSession {
public:explicit Session(tcp::socket socket) : socket_(std::move(socket)) {}// 开始会话void start() {do_read(); // 开始读取数据}private:// 异步读取数据void do_read() {auto self(shared_from_this());socket_.async_read_some(boost::asio::buffer(data_, max_length),[this, self](boost::system::error_code ec, std::size_t length) {if (!ec) {std::cout Received: data_ std::endl;do_write(length); // 读取完成后写入数据}});}// 异步写入数据void do_write(std::size_t length) {auto self(shared_from_this());boost::asio::async_write(socket_, boost::asio::buffer(data_, length),[this, self](boost::system::error_code ec, std::size_t /*length*/) {if (!ec) {do_read(); // 写入完成后继续读取数据}});}tcp::socket socket_; // 套接字enum { max_length 1024 };char data_[max_length]; // 数据缓冲区
};// 服务器类用于管理客户端连接
class Server {
public:Server(boost::asio::io_context io_context, short port): acceptor_(io_context, tcp::endpoint(tcp::v4(), port)) {do_accept(); // 开始接受连接}private:// 异步接受连接void do_accept() {acceptor_.async_accept([this](boost::system::error_code ec, tcp::socket socket) {if (!ec) {std::make_sharedSession(std::move(socket))-start();}do_accept(); // 继续接受下一次连接});}tcp::acceptor acceptor_; // 接受器用于监听连接
};int main(int argc, char* argv[]) {try {if (argc ! 2) {std::cerr Usage: async_tcp_echo_server port\n;return 1;}boost::asio::io_context io_context; // IO上下文Server s(io_context, std::atoi(argv[1])); // 创建服务器io_context.run(); // 运行IO上下文} catch (std::exception e) {std::cerr Exception: e.what() \n;}return 0;
}运行结果
在终端运行服务器实例
./BoostServer 8080然后在另一个终端使用telnet连接服务器
telnet localhost 8080输入消息时服务器将回显收到的消息。
输出结果
Connected to localhost.
Escape character is ^].
Hello, Server!
Received: Hello, Server!总结 本文详细阐述了C网络编程的基本概念、原理和核心技术结合实际项目示例涵盖了多线程处理多个客户端连接和使用Boost.Asio库进行异步编程的实现方式。通过这些技术和示例代码高级C开发者可以深入理解和掌握C网络编程的关键技术为开发高效、可扩展的网络应用打下坚实的基础。希望这些代码和注释能够帮助你更好地理解和应用C网络编程。