C 语言作为一门经典的系统级编程语言,因其高效、灵活的特性在服务器端开发中依然占据着重要地位,本教程将带你从 C 语言的基础知识出发,逐步深入到服务器编程的核心技术,最终掌握构建高性能服务器的技巧。
基础知识回顾
1 C 语言概述
C 语言是一种通用的程序设计语言,由 Dennis Ritchie 在贝尔实验室于1972年开发,它以其简洁明了的语法和强大的功能成为许多操作系统(如 Unix 和 Linux)以及嵌入式系统的核心开发语言。
2 数据类型与运算符
-
基本数据类型:
int
:整型变量,通常占用 4 字节内存空间。char
:字符型变量,通常占用 1 字节内存空间。float
和double
:浮点数类型,分别占用 4 字节和 8 字节内存空间。
-
运算符:
- 算术运算符:, , , ,
- 赋值运算符:, , , , ,
- 关系运算符:, ,
<
,>
,<=
,>=
- 逻辑运算符:
&&
, ,
3 流程控制语句
-
条件语句:
图片来源于网络,如有侵权联系删除
if
语句用于单分支选择。switch
语句适用于多分支选择。goto
语句虽然存在但建议避免使用,因为它可能导致代码难以维护。
-
循环语句:
for
循环:初始化、条件判断、更新三部分构成完整循环。while
循环:先判断条件再执行循环体。do...while
循环:先执行循环体后判断条件。
网络通信基础
1 网络协议简介
TCP/IP 协议族是互联网的基础通信协议,包括传输层(TCP 和 UDP)、网络层(IP)、链路层等,TCP 提供可靠的数据传输服务,而 UDP 则提供不可靠的无连接服务。
2 socket 编程
Socket 是实现客户端/服务器通信的基本接口,在 C 语言中,可以使用标准库函数如 socket()
, bind()
, listen()
, accept()
等,来创建和管理套接字。
图片来源于网络,如有侵权联系删除
创建套接字:
#include <sys/socket.h> int sockfd = socket(AF_INET, SOCK_STREAM, 0);
绑定本地地址:
struct sockaddr_in servaddr; memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(12345); bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
监听连接请求:
listen(sockfd, 5); // 允许队列中的最大连接数为 5
接受连接:
int newfd = accept(sockfd, NULL, NULL);
服务器端编程实践
1 基础服务器示例
以下是一个简单的 HTTP 服务器示例,用于响应客户端的 GET 请求并发送静态网页内容。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BUFFER_SIZE 1024 void handle_request(int client_fd) { char buffer[BUFFER_SIZE]; ssize_t bytes_read; while ((bytes_read = read(client_fd, buffer, BUFFER_SIZE)) > 0) { printf("Received: %s\n", buffer); // 发送 HTTP 响应头 const char *response_header = "HTTP/1.1 200 OK\r\n" "Content-Type: text/html; charset=UTF-8\r\n" "\r\n"; write(client_fd, response_header, strlen(response_header)); // 发送 HTML 内容 const char *html_content = "<html><body><h1>Hello World!</h1></body></html>"; write(client_fd, html_content, strlen(html_content)); } close(client_fd); } int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t addr_len = sizeof(struct sockaddr_in); // 创建套接字 server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { perror("socket creation failed"); exit(EXIT_FAILURE); }
标签: #c 服务器编程教程
评论列表