TCP 服务端获取当前连接客户端的地址
时间: 2023-06-05 15:08:30 浏览: 70
获取当前连接客户端的地址可以通过以下代码实现:
```c
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
// 创建 socket 文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
return 1;
}
// 设定 socket 参数
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt failed");
return 1;
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
// 将 socket 绑定在本地端口 8080 上
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
return 1;
}
if (listen(server_fd, 3) < 0) {
perror("listen failed");
return 1;
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) {
perror("accept failed");
return 1;
}
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &address.sin_addr, client_ip, INET_ADDRSTRLEN);
printf("Connected with client: %s:%d\n", client_ip, ntohs(address.sin_port));
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
return 0;
}
```
在这个例子中,我们使用 socket 函数创建了一个 TCP socket,bind 函数将 socket 绑定到本地端口 8080 上,并使用 listen 函数开启监听模式;当有新的连接时,accept 函数会阻塞并等待新的连接到来,当连接成功建立之后,可以通过 inet_ntop 函数将客户端地址转换为字符串类型并打印出来。