python,from flask import Flask,app = Flask(__name__),@app.route('/'),def hello_world():, return 'Hello, World!',if __name__ == '__main__':, app.run(),
“
在网络编程领域,使用C语言编写简单的服务器是一个基础且重要的任务,以下将介绍如何用C语言编写一个简单的TCP服务器:
1、创建套接字:
使用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,表示使用默认协议,创建一个IPv4的TCP套接字可以使用socket(AF_INET, SOCK_STREAM, 0);
。
2、绑定端口:
使用bind()
函数将套接字与本地地址和端口号绑定,该函数的原型如下:
int bind(int sockfd, struct sockaddr addr, socklen_t addrlen);
sockfd
是套接字描述符。
addr
是一个指向sockaddr
结构的指针,包含要绑定的地址信息,对于IPv4,通常使用struct sockaddr_in
结构,并设置其成员变量sin_family
为AF_INET
,sin_port
为所需的端口号(需要使用网络字节序,可通过htons()
函数转换),sin_addr.s_addr
为INADDR_ANY
表示绑定到所有本地地址。
addrlen
是地址结构的长度。
struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8080); server_addr.sin_addr.s_addr = INADDR_ANY; bind(sockfd, (struct sockaddr)&server_addr, sizeof(server_addr));
3、监听连接:
使用listen()
函数使套接字进入被动打开状态,准备接受客户端的连接请求,该函数的原型如下:
int listen(int sockfd, int backlog);
sockfd
是套接字描述符。
backlog
是请求队列的最大长度,即允许排队等待的最大连接请求数。
listen(sockfd, 5);
4、接受连接:
使用accept()
函数接受客户端的连接请求,并返回一个新的套接字描述符用于与客户端通信,该函数的原型如下:
int accept(int sockfd, struct sockaddr cliaddr, socklen_t addrlen);
sockfd
是被监听的套接字描述符。
cliaddr
是一个指向sockaddr
结构的指针,用于存储客户端的地址信息。
addrlen
是地址结构的长度。
struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_sockfd = accept(sockfd, (struct sockaddr)&client_addr, &client_addr_len);
5、数据接收与发送:
使用recv()
或recvfrom()
函数接收客户端发送的数据。recv()
函数用于已连接的套接字,而recvfrom()
函数可用于未连接的套接字。
使用send()
或sendto()
函数向客户端发送数据。send()
函数用于已连接的套接字,而sendto()
函数可用于未连接的套接字。
以下是一个简单的示例代码,展示了如何使用C语言编写一个基本的TCP服务器:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #define PORT 8080 #define BUFFER_SIZE 1024 int main() { int server_sockfd, client_sockfd; struct sockaddr_in server_addr, client_addr; char buffer[BUFFER_SIZE]; socklen_t client_addr_len = sizeof(client_addr); // 创建套接字 server_sockfd = socket(AF_INET, SOCK_STREAM, 0); if (server_sockfd == -1) { perror("socket"); exit(EXIT_FAILURE); } // 绑定端口 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; if (bind(server_sockfd, (struct sockaddr)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); close(server_sockfd); exit(EXIT_FAILURE); } // 监听连接 if (listen(server_sockfd, 5) == -1) { perror("listen"); close(server_sockfd); exit(EXIT_FAILURE); } printf("Server is listening on port %d... ", PORT); // 接受连接 client_sockfd = accept(server_sockfd, (struct sockaddr)&client_addr, &client_addr_len); if (client_sockfd == -1) { perror("accept"); close(server_sockfd); exit(EXIT_FAILURE); } printf("Client connected from %s:%d ", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); // 接收数据 ssize_t bytes_received = recv(client_sockfd, buffer, BUFFER_SIZE 1, 0); if (bytes_received == -1) { perror("recv"); close(client_sockfd); close(server_sockfd); exit(EXIT_FAILURE); } buffer[bytes_received] = '