#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #define PORT 12345 #define BUFFER_SIZE 1024 int main() { int sockfd, newsockfd, n; struct sockaddr_in server_addr, client_addr; socklen_t client_len; char buffer[BUFFER_SIZE]; // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("Error in socket"); exit(1); } // 设置服务器地址结构 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("Error in bind"); exit(1); } // 监听连接请求 if (listen(sockfd, 5) < 0) { perror("Error in listen"); exit(1); } printf("TCP Server listening on port %d...\n", PORT); // 接受连接请求 client_len = sizeof(client_addr); newsockfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len); if (newsockfd < 0) { perror("Error in accept"); exit(1); } // 接收数据并发送回复 while (1) { memset(buffer, 0, sizeof(buffer)); n = recv(newsockfd, buffer, sizeof(buffer) - 1, 0); if (n <= 0) { break; } printf("Received: %s", buffer); // 在这里进行处理和逻辑操作 n = send(newsockfd, buffer, strlen(buffer), 0); if (n < 0) { perror("Error in send"); exit(1); } } // 关闭套接字 close(newsockfd); close(sockfd); return 0; }
时间: 2024-04-26 12:20:52 浏览: 88
这段代码是一个简单的TCP服务器的实现,它可以监听指定的端口,接受客户端的连接请求,接收客户端发送的数据并进行处理,然后将处理结果发送回客户端。
具体的实现过程如下:
1. 创建套接字:使用socket()函数创建一个套接字,指定协议族(AF_INET)和套接字类型(SOCK_STREAM)。
2. 设置服务器地址结构:初始化一个sockaddr_in结构体,指定服务器的IP地址(INADDR_ANY表示任意地址)、端口号等信息。
3. 绑定套接字:使用bind()函数将套接字与服务器地址绑定起来,指定监听的端口号。
4. 监听连接请求:使用listen()函数开始监听客户端的连接请求,指定等待连接的队列长度。
5. 接受连接请求:使用accept()函数接受客户端的连接请求,返回一个新的套接字用于与客户端通信。
6. 接收数据并发送回复:使用recv()函数接收客户端发送的数据,进行处理和逻辑操作,然后使用send()函数将处理结果发送回客户端。
7. 关闭套接字:使用close()函数关闭套接字。
需要注意的是,这段代码只能处理单个客户端的连接请求,如果需要处理多个客户端的连接请求,可以使用多线程或多进程的方式进行处理。
相关问题
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main() { int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字 if (server_socket < 0) { perror("socket"); return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字 if (iResult < 0) { perror("bind"); close(server_socket); return 1; } iResult = listen(server_socket, SOMAXCONN); // 监听套接字 if (iResult < 0) { perror("listen"); close(server_socket); return 1; } printf("服务器已启动,等待连接...\n"); int counter = 0; while (1) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // 接受客户端连接 if (client_socket < 0) { perror("accept"); close(server_socket); return 1; } counter++; // 每当有一个新的客户端连接时,计数器加1 printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter); char reply[1024]; sprintf(reply, "你是今天第%d个客户端", counter); send(client_socket, reply, strlen(reply), 0); // 发送回复消息 close(client_socket); } close(server_socket); return 0;},在此代码基础上增加输出当前时间的功能
可以使用time.h头文件中的函数来获取当前时间,并将其格式化输出。修改后的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h> // 添加时间头文件
int main() {
int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字
if (server_socket < 0) {
perror("socket");
return 1;
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8000);
int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字
if (iResult < 0) {
perror("bind");
close(server_socket);
return 1;
}
iResult = listen(server_socket, SOMAXCONN); // 监听套接字
if (iResult < 0) {
perror("listen");
close(server_socket);
return 1;
}
printf("服务器已启动,等待连接...\n");
int counter = 0;
while (1) {
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // 接受客户端连接
if (client_socket < 0) {
perror("accept");
close(server_socket);
return 1;
}
counter++;
printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter);
// 添加时间输出
time_t now = time(NULL);
struct tm* time_info = localtime(&now);
char time_str[20];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time_info);
printf("当前时间是:%s\n", time_str);
char reply[1024];
sprintf(reply, "你是今天第%d个客户端", counter);
send(client_socket, reply, strlen(reply), 0);
close(client_socket);
}
close(server_socket);
return 0;
}
```
这样每当有客户端连接时,服务器就会输出当前的时间。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <time.h> // 添加时间头文件 int main() { int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字 if (server_socket < 0) { perror("socket"); return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字 if (iResult < 0) { perror("bind"); close(server_socket); return 1; } iResult = listen(server_socket, SOMAXCONN); // 监听套接字 if (iResult < 0) { perror("listen"); close(server_socket); return 1; } printf("服务器已启动,等待连接...\n"); int counter = 0; while (1) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // 接受客户端连接 if (client_socket < 0) { perror("accept"); close(server_socket); return 1; } counter++; printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter); // 添加时间输出 time_t now = time(NULL); struct tm* time_info = localtime(&now); char time_str[20]; strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time_info); printf("当前时间是:%s\n", time_str); char reply[1024]; sprintf(reply, "你是今天第%d个客户端", counter); send(client_socket, reply, strlen(reply), 0); close(client_socket); } close(server_socket); return 0; }修改成在客户端输出时间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
int main() {
int client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字
if (client_socket < 0) {
perror("socket");
return 1;
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8000);
inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
int iResult = connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 连接服务器
if (iResult < 0) {
perror("connect");
close(client_socket);
return 1;
}
char buffer[1024] = {0};
iResult = recv(client_socket, buffer, sizeof(buffer)-1, 0); // 接收服务器的消息
if (iResult < 0) {
perror("recv");
close(client_socket);
return 1;
}
printf("%s\n", buffer); // 输出服务器的消息
time_t now = time(NULL); // 获取当前时间
struct tm* time_info = localtime(&now); // 转换为本地时间
char time_str[20];
strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time_info); // 格式化时间字符串
printf("当前时间是:%s\n", time_str); // 输出当前时间
close(client_socket);
return 0;
}
阅读全文