inet_addr和inet_ntoa头文件
时间: 2024-03-08 17:46:29 浏览: 155
inet_addr和inet_ntoa函数都是网络编程中用于IP地址转换的函数,它们在C语言中的声明分别在头文件<arpa/inet.h>和<netinet/in.h>中。
inet_addr函数将点分十进制的IP地址转换为网络字节序的32位二进制整数,其函数原型为:
```
in_addr_t inet_addr(const char *cp);
```
其中,参数cp是一个指向点分十进制IP地址的字符数组的指针,返回值是转换后的32位二进制整数。如果转换失败,则返回INADDR_NONE。
inet_ntoa函数将一个32位二进制整数表示的网络字节序IP地址转换为点分十进制的IP地址,其函数原型为:
```
char *inet_ntoa(struct in_addr in);
```
其中,参数in是一个in_addr结构体类型,表示要转换的32位二进制整数。返回值是一个指向点分十进制IP地址的静态字符数组的指针。由于返回值是一个静态数组,因此每次调用inet_ntoa函数都会覆盖之前的返回值,因此如果需要保存转换后的IP地址,需要将其复制到另一个字符数组中。
相关问题
将代码inet_ntoa(client_addr.sin_addr)改为inet_ntop()函数
inet_ntop() 函数能够将网络字节序的二进制IP地址转换为点分十进制格式的字符串IP地址。如果要将代码中的inet_ntoa()函数改为inet_ntop()函数,需要修改以下几点:
1. 在头文件中包含<arpa/inet.h>以使用inet_ntop()函数。
2. 将inet_ntoa(client_addr.sin_addr)替换为inet_ntop(AF_INET, &(client_addr.sin_addr), client_ip, INET_ADDRSTRLEN),其中client_ip是存放字符串IP地址的缓冲区,INET_ADDRSTRLEN是缓冲区大小。
3. 在调用inet_ntop()函数之前,需要将client_ip缓冲区清空,以防止出现未知的字符。
下面是修改后的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8080
int main(int argc, char const *argv[]) {
int server_fd, new_socket, valread;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
char *hello = "Hello from server";
char client_ip[INET_ADDRSTRLEN];
// Creating socket file descriptor
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Forcefully attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t *)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// Convert binary IP address to string IP address
memset(client_ip, '\0', INET_ADDRSTRLEN);
inet_ntop(AF_INET, &(address.sin_addr), client_ip, INET_ADDRSTRLEN);
printf("Connection accepted from %s:%d\n", client_ip, ntohs(address.sin_port));
valread = read(new_socket, buffer, 1024);
printf("%s\n", buffer);
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
return 0;
}
```
报错warning: implicit declaration of function ‘inet_ntoa’ [-Wimplicit-function-declaration] 49 | printf("客户端 %s:%d 已连接\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); | ^~~~~~~~~ 1.c:49:28: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
这个警告提示说,在你的代码中使用了一个未声明的函数 `inet_ntoa()`,所以编译器无法确定该函数的返回类型和参数类型,因此会给出这个警告。同时,还有一个格式化字符串错误,因为 `%s` 格式符需要一个字符串作为参数,但是你传递给它的是一个整数,所以编译器会给出第二个警告。
你需要包含一个头文件 `<arpa/inet.h>` 来声明 `inet_ntoa()` 函数,这个头文件包含了一些网络编程相关的函数和定义。同时,你需要使用 `%d` 格式符来打印一个整数,而不是 `%s` 格式符。
修复代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
// 创建 socket
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("创建 socket 失败");
exit(EXIT_FAILURE);
}
// 准备地址和端口
struct sockaddr_in server_addr = {0};
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)) == -1) {
perror("绑定地址和端口失败");
exit(EXIT_FAILURE);
}
// 监听端口
if (listen(server_fd, 5) == -1) {
perror("监听端口失败");
exit(EXIT_FAILURE);
}
// 接受客户端连接
struct sockaddr_in client_addr = {0};
socklen_t client_addr_len = sizeof(client_addr);
int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
if (client_fd == -1) {
perror("接受客户端连接失败");
exit(EXIT_FAILURE);
}
// 打印客户端地址和端口
char client_ip[20];
inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip));
printf("客户端 %s:%d 已连接\n", client_ip, ntohs(client_addr.sin_port));
// 关闭连接
close(client_fd);
close(server_fd);
return 0;
}
```
阅读全文