实现简单的TCP服务器
首先我们先选择一个端口号用于 TCP 或 UDP 网络通信。如果你运行一个服务或应用程序,监听端口就是通过该端口接收来自客户端的请求。
这里我们选择2048
先在ubuntu系统中输入netstat -anop | grep 2048
,会显示以下信息
这代表此时2048
端口号没有被占用
我们在ubuntu系统中用c编写以下程序
#include // 标准输入输出库,用于打印和输入
#include // 套接字相关函数
#include // 定义了 IP 协议族相关的常量和结构体
#include // 字符串处理函数
#include // 系统调用接口,包括 close 函数
#include // 提供了 IP 地址转换函数等
int main() {
// 创建一个 TCP 套接字,返回套接字描述符
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
return -1;
}
// 配置服务器端的地址结构
struct sockaddr_in serveraddr;
memset(&serveraddr, 0, sizeof(struct sockaddr_in)); // 初始化地址结构为零
serveraddr.sin_family = AF_INET; // 使用 IPv4 地址
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定到任意 IP 地址
serveraddr.sin_port = htons(2048); // 绑定到端口 2048
// 将服务器端地址和端口绑定到套接字上
if (-1 == bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(struct sockaddr))) {
perror("bind");
return -1;
}
// 开始监听端口,最多允许 10 个连接排队
if (listen(sockfd, 10) == -1) {
perror("listen");
return -1;
}
// 等待客户端连接
struct sockaddr_in clientaddr;
socklen_t len = sizeof(clientaddr);
int clientfd = accept(sockfd, (struct sockaddr*)&clientaddr, &len); // 接受客户端连接
if (clientfd == -1) {
perror("accept");
return -1;
}
printf("Client connected
");
// 接收客户端数据
char buffer[128] = {
0}; // 缓冲区存放接收到的数据
int count = recv(clientfd, buffer, 128, 0); // 接收数据
if (count == -1) {
perror("recv");
close(clientfd);
return -1;
}
// 发送接收到的数据给客户端
send(clientfd, buffer, count, 0);
// 打印相关信息
printf("sockfd: %d, clientfd: %d, count: %d, buffer: %s
", sockfd, clientfd, count, buffer);
// 等待用户输入后关闭客户端连接
getchar();
close(clientfd); // 关闭客户端套接字
return 0; // 程序正常结束
}
代码解释:
-
创建套接字:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
使用
socket()
创建一个 TCP 套接字。AF_INET
表示使用 IPv4 地址族,SOCK_STREAM
表示创建一个流式套接