用C语言 编写一个套接字程序,要求服务器等待客户的连接请求,一旦有客户连接,服务器打印出客户端的IP地址和端口,并向客户端发送欢迎信息。 【需要额外学习使用getpeername函数完成。】
时间: 2024-03-01 15:52:04 浏览: 54
以下是一个使用 C 语言编写的套接字程序,实现服务器等待客户连接请求,打印出客户端的 IP 地址和端口,并向客户端发送欢迎信息。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *welcome = "Welcome to the server!";
// 创建套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置套接字选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定地址和端口号
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, 3) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
// 等待客户连接请求
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
// 打印客户端 IP 地址和端口号
struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&address;
struct in_addr ipAddr = pV4Addr->sin_addr;
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &ipAddr, ip, INET_ADDRSTRLEN);
printf("Client IP address: %s\n", ip);
printf("Client port: %d\n", ntohs(pV4Addr->sin_port));
// 发送欢迎信息
send(new_socket, welcome, strlen(welcome), 0);
printf("Welcome message sent\n");
return 0;
}
```
该程序首先创建一个套接字,并设置套接字选项。然后将地址和端口号绑定到套接字上,并开始监听连接请求。一旦有客户端连接,程序使用 accept 函数接受连接,并打印客户端的 IP 地址和端口号,以及向客户端发送欢迎信息。在打印客户端 IP 地址和端口号时,使用了 getpeername 函数获取客户端的地址信息。
需要注意的是,该程序只处理一个客户端连接,如果需要处理多个客户端连接,则需要在循环中调用 accept 函数,每次处理一个连接。
阅读全文