在Linux系统下用c语言编写一个socket程序。要求服务端等待客户端的连接请求,一旦有客户端连接,服务端打印储客户端的IP地址和端口,并且向客户端发送欢迎信息和时间。客户端连接并接受欢迎信息和时间
时间: 2023-06-26 07:06:36 浏览: 104
C语言实现socket服务端和客户端
4星 · 用户满意度95%
下面是一个简单的示例代码,实现了你所要求的功能:
服务端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#define PORT 8888
#define MAXLINE 1024
int main() {
int sockfd, connfd;
struct sockaddr_in servaddr, cliaddr;
char buff[MAXLINE];
time_t ticks;
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 初始化服务器地址结构体
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT);
// 绑定 socket 和地址
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 监听 socket
listen(sockfd, 5);
printf("Server is listening on port %d\n", PORT);
while (1) {
socklen_t clilen = sizeof(cliaddr);
// 接受客户端连接
connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &clilen);
// 打印客户端 IP 地址和端口号
printf("Client connected: %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
// 获取当前时间
ticks = time(NULL);
// 构造欢迎信息
snprintf(buff, sizeof(buff), "Welcome to my server! The current time is: %.24s\r\n", ctime(&ticks));
// 发送欢迎信息
write(connfd, buff, strlen(buff));
// 关闭连接
close(connfd);
}
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define MAXLINE 1024
int main() {
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
// 创建 socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
// 初始化服务器地址结构体
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
// 将 IP 地址转换为网络字节序
inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
// 连接服务器
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
// 读取服务器发送的欢迎信息和时间
while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
recvline[n] = 0;
if (fputs(recvline, stdout) == EOF) {
printf("fputs error\n");
}
}
if (n < 0) {
printf("read error\n");
}
return 0;
}
```
编译运行:
```
// 编译服务端代码
gcc server.c -o server
// 编译客户端代码
gcc client.c -o client
// 启动服务端
./server
// 启动客户端
./client
```
客户端输出:
```
Welcome to my server! The current time is: Sun Jan 23 15:28:29 2022
```
阅读全文