sock_ntop()函数的实现

#include    "unp.h"
 
#ifdef  HAVE_SOCKADDR_DL_STRUCT
#include    <net/if_dl.h>
#endif
 
/* include sock_ntop */
char  *
sock_ntop( const  struct  sockaddr *sa, socklen_t salen)
{
     char         portstr[8];
     static  char  str[128];      /* Unix domain is largest */
 
     switch  (sa->sa_family) {
     case  AF_INET: {
         struct  sockaddr_in * sin  = ( struct  sockaddr_in *) sa;
 
         if  (inet_ntop(AF_INET, & sin ->sin_addr, str,  sizeof (str)) == NULL)
             return (NULL);
         if  (ntohs( sin ->sin_port) != 0) {
             snprintf(portstr,  sizeof (portstr),  ":%d" , ntohs( sin ->sin_port));
             strcat (str, portstr);
         }
         return (str);
     }
/* end sock_ntop */
 
#ifdef  IPV6
     case  AF_INET6: {
         struct  sockaddr_in6    *sin6 = ( struct  sockaddr_in6 *) sa;
 
         str[0] =  '[' ;
         if  (inet_ntop(AF_INET6, &sin6->sin6_addr, str + 1,  sizeof (str) - 1) == NULL)
             return (NULL);
         if  (ntohs(sin6->sin6_port) != 0) {
             snprintf(portstr,  sizeof (portstr),  "]:%d" , ntohs(sin6->sin6_port));
             strcat (str, portstr);
             return (str);
         }
         return  (str + 1);
     }
#endif
 
#ifdef  AF_UNIX
     case  AF_UNIX: {
         struct  sockaddr_un *unp = ( struct  sockaddr_un *) sa;
 
             /* OK to have no pathname bound to the socket: happens on
                every connect() unless client calls bind() first. */
         if  (unp->sun_path[0] == 0)
             strcpy (str,  "(no pathname bound)" );
         else
             snprintf(str,  sizeof (str),  "%s" , unp->sun_path);
         return (str);
     }
#endif
 
#ifdef  HAVE_SOCKADDR_DL_STRUCT
     case  AF_LINK: {
         struct  sockaddr_dl *sdl = ( struct  sockaddr_dl *) sa;
 
         if  (sdl->sdl_nlen > 0)
             snprintf(str,  sizeof (str),  "%*s (index %d)" ,
                      sdl->sdl_nlen, &sdl->sdl_data[0], sdl->sdl_index);
         else
             snprintf(str,  sizeof (str),  "AF_LINK, index=%d" , sdl->sdl_index);
         return (str);
     }
#endif
     default :
         snprintf(str,  sizeof (str),  "sock_ntop: unknown AF_xxx: %d, len %d" ,
                  sa->sa_family, salen);
         return (str);
     }
     return  (NULL);
}
 
char  *
Sock_ntop( const  struct  sockaddr *sa, socklen_t salen)
{
     char     *ptr;
 
     if  ( (ptr = sock_ntop(sa, salen)) == NULL)
         err_sys( "sock_ntop error" );     /* inet_ntop() sets errno */
     return (ptr);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值