用c语言创建服务器端程序,监听在8888端口,当客户端程序发出请求字符串:getdatetime时,返回当前服务器端机器的时间,格式为:yyyy-MM-dd HH:mm:ss
时间: 2023-06-01 19:02:02 浏览: 140
ESP32Time:一个Arduino库,用于在ESP32板上设置和检索内部RTC时间
以下是一个简单的服务器端程序,使用C语言编写,监听在8888端口。当客户端程序发送字符串“getdatetime”时,服务器端程序会返回当前时间,格式为“yyyy-MM-dd HH:mm:ss”。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8888
#define MAXLINE 1024
int main() {
int sockfd;
struct sockaddr_in servaddr, cliaddr;
char buf[MAXLINE];
char* getdatetime = "getdatetime";
time_t now;
struct tm* timeinfo;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
while (1) {
socklen_t len = sizeof(cliaddr);
int n = recvfrom(sockfd, buf, MAXLINE, 0, (struct sockaddr*)&cliaddr, &len);
if (n < 0) {
perror("recvfrom");
continue;
}
buf[n] = '\0';
printf("Received request from %s:%d: %s\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port), buf);
if (strcmp(buf, getdatetime) == 0) {
now = time(NULL);
timeinfo = localtime(&now);
strftime(buf, MAXLINE, "%Y-%m-%d %H:%M:%S", timeinfo);
if (sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&cliaddr, len) < 0) {
perror("sendto");
continue;
}
}
}
close(sockfd);
return 0;
}
```
该程序使用UDP协议进行通信。当接收到客户端发送的字符串“getdatetime”时,程序会获取当前时间并将其格式化为字符串,然后通过sendto函数将其发送回客户端。如果接收到的请求不是“getdatetime”,则程序会忽略该请求并等待下一个请求。程序会一直监听在8888端口,直到被中断或关闭。
阅读全文