在Linux系统下编写一个socket程序。要求服务端等待客户端的连接请求,一旦有客户端连接,服务端打印出客户端的IP地址和端口,并且向客户端发送欢迎信息和时间。
时间: 2023-11-12 08:05:46 浏览: 136
下面是一个简单的示例程序,可以实现服务端等待客户端连接请求,一旦有客户端连接,服务端打印出客户端的IP地址和端口,并且向客户端发送欢迎信息和时间。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
int main(int argc, char *argv[]) {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[256];
time_t now;
// 创建套接字
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("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(8888);
// 绑定套接字到服务器地址
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
exit(1);
}
// 监听套接字
if (listen(server_fd, 5) < 0) {
perror("listen");
exit(1);
}
printf("Server started, waiting for clients...\n");
// 接受客户端连接请求
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);
if (client_fd < 0) {
perror("accept");
exit(1);
}
printf("Client connected: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 发送欢迎信息和时间
now = time(NULL);
sprintf(buffer, "Welcome! The current time is: %s", ctime(&now));
write(client_fd, buffer, strlen(buffer));
// 关闭套接字
close(client_fd);
close(server_fd);
return 0;
}
```
编译并运行程序,可以通过telnet命令连接到服务端,并且接收到服务端发送的欢迎信息和时间。
```
$ gcc server.c -o server
$ ./server
Server started, waiting for clients...
```
在另一个终端中使用telnet命令连接服务端:
```
$ telnet localhost 8888
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Welcome! The current time is: Fri Sep 24 16:50:06 2021
Connection closed by foreign host.
```
阅读全文