怎么给 char ip[INET_ADDRSTRLEN]赋定值
时间: 2024-10-12 22:07:37 浏览: 34
在C语言中,如果你想给一个字符数组`ip[INET_ADDRSTRLEN]`赋一个IPv4地址字符串,你可以使用inet_pton函数将IP地址转换成网络字节序的二进制数据,然后再将其复制到数组中。这里是一个简单的步骤:
```c
#include <arpa/inet.h> // 包含inet_pton函数
// 假设你已经有了一个有效的IPv4地址字符串,如"192.168.1.1"
char ip[INET_ADDRSTRLEN];
size_t addressLength = sizeof(ip);
if (inet_pton(AF_INET, "192.168.1.1", ip) == 1) {
// 如果转换成功,inet_pton返回1
ip[addressLength - 1] = '\0'; // 结束字符串,因为inet_pton不会添加终止符
} else {
// 如果转换失败,inet_pton会返回0
printf("Invalid IP address.\n");
}
```
注意, inet_pton函数的第一个参数(AF_INET表示IPv4)返回的是转换后的二进制数据长度,如果正好填满数组,就说明转换成功并自动添加了终止符'\0';若不够则需要手动添加。
相关问题
int main(int argc, char *argv[]) { char recv_buf[2048] = ""; // 接收缓冲区 int sockfd = 0; // 套接字 int connfd = 0; int err_log = 0; struct sockaddr_in my_addr; // 服务器地址结构体 unsigned short port = 8000; // 监听端口 if(argc > 1) // 由参数接收端口 { port = atoi(argv[1]); } printf("TCP Server Started at port %d!\n", port); sockfd = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP套接字 if(sockfd < 0) { perror("socket"); exit(-1); } bzero(&my_addr, sizeof(my_addr)); // 初始化服务器地址 my_addr.sin_family = AF_INET; my_addr.sin_port = htons(port); my_addr.sin_addr.s_addr = htonl(INADDR_ANY); printf("Binding server to port %d\n", port); err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr)); if( err_log != 0) { perror("binding"); close(sockfd); exit(-1); } err_log = listen(sockfd, 10); if(err_log != 0) { perror("listen"); close(sockfd); exit(-1); } printf("Waiting client...\n"); while(1) { size_t recv_len = 0; struct sockaddr_in client_addr; // 用于保存客户端地址 char cli_ip[INET_ADDRSTRLEN] = ""; // 用于保存客户端IP地址 socklen_t cliaddr_len = sizeof(client_addr); // 必须初始化!!! connfd = accept(sockfd, (struct sockaddr*)&client_addr, &cliaddr_len); // 获得一个已经建立的连接 if(connfd < 0) { perror("accept"); continue; } inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN); printf("client ip = %s\n", cli_ip); while((recv_len = recv(connfd, recv_buf, sizeof(recv_buf), 0)) > 0) { send(connfd, recv_buf, recv_len, 0); } close(connfd); //关闭已连接套接字 printf("client closed!\n"); } //6.与客户端通信 char buff[128] = {0}; read(acceptfd, buff, 128); printf("%s-%d:[%s]\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buff); strcat(buff, "--hqyj"); write(acceptfd, buff, 128); close(sockfd); //关闭监听套接字 return 0; }
这是一段使用 C 语言编写的 TCP 服务器程序,它可以监听指定端口的连接请求,并接收客户端发送的数据,并将接收到的数据返回给客户端。程序中使用了 socket() 函数创建了一个 TCP 套接字,然后使用 bind() 函数将服务器地址绑定到套接字上,并使用 listen() 函数开始监听客户端连接请求。程序使用 accept() 函数接收客户端连接,并在接收到连接后使用 recv() 函数接收客户端发送的数据,并使用 send() 函数将接收到的数据返回给客户端。程序在循环中不断接收客户端连接请求,并与客户端进行通信,直到程序被手动终止。
将这个语句inet_ntoa(client_sin.sin_addr)改写为inet_ntop函数
将inet_ntoa(client_sin.sin_addr)改写为inet_ntop函数的代码如下:
```c
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(client_sin.sin_addr), client_ip, INET_ADDRSTRLEN);
```
其中,AF_INET表示IP地址族为IPv4,&(client_sin.sin_addr)为指向IPv4地址的指针,client_ip为存放转换后IP地址的缓冲区,INET_ADDRSTRLEN为缓冲区大小。
阅读全文