在Linux系统下编写一个socket程序。要求服务端等待客户端的连接请求,一旦有客户端连接,服务端打印出客户端的IP地址和端口,并且向客户端发送欢迎信息和时间。
时间: 2023-11-12 20:05:45 浏览: 83
linux下的一个socket服务端与客户端的一两个程序
4星 · 用户满意度95%
以下是一个简单的C语言程序,实现了在Linux系统下编写一个socket程序,要求服务端等待客户端的连接请求,一旦有客户端连接,服务端打印出客户端的IP地址和端口,并且向客户端发送欢迎信息和时间。
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#define PORT 8888 // 服务端监听的端口号
#define MAXLINE 1024 // 缓冲区大小
int main() {
int sockfd; // 套接字描述符
struct sockaddr_in servaddr, cliaddr; // 服务端和客户端地址结构体
char buff[MAXLINE]; // 缓冲区
time_t ticks; // 时间戳
// 创建套接字
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket error");
exit(1);
}
// 初始化服务端地址结构体
bzero(&servaddr, 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)) == -1) {
perror("bind error");
exit(1);
}
// 开始监听客户端连接请求
if (listen(sockfd, 5) == -1) {
perror("listen error");
exit(1);
}
printf("server is listening on port %d...\n", PORT);
while (1) {
socklen_t len = sizeof(cliaddr);
int connfd; // 已连接套接字描述符
// 接收客户端连接请求
if ((connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &len)) == -1) {
perror("accept error");
continue;
}
printf("connection from %s, port %d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 获取当前时间戳
ticks = time(NULL);
// 构造欢迎信息
snprintf(buff, sizeof(buff), "welcome to my server, the time is %.24s\r\n", ctime(&ticks));
// 向客户端发送欢迎信息和时间
if (write(connfd, buff, strlen(buff)) == -1) {
perror("write error");
continue;
}
// 关闭连接
close(connfd);
}
return 0;
}
```
在终端中编译并运行这个程序,可以看到服务端正在监听8888端口,等待客户端的连接请求。当有客户端连接时,服务端会打印出客户端的IP地址和端口,并向客户端发送欢迎信息和时间。
阅读全文