#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <errno.h>
#if 0
void test()
{
unsigned int data=0x12345678;
char * p =NULL;
p= (char *)&data;
printf("%x, %x, %x, %x \n", p[0], p[1], p[2], p[3]);
if(p[0] == 0x78)
{
printf("當前系統是小端模式\n");
}
else
{
printf("當前系統是大端模式\n");
}
printf("把本地字節轉換成網絡字節\n");
uint32_t mynetdata = htonl(data);
p = (char *)&mynetdata;
if(p[0] == 0x78)
{
printf("網絡字節序是是小端模式\n");
}
else
{
printf("網絡字節序是是大端模式\n");
}
}
#endif
/*
信號處理函數遇上可重入和不可重入函數
可重入函數概念
1、爲了增強程序的穩定性,在信號處理函數中應使用可重入函數。
2、所謂可重入函數是指一個可以被多個任務調用的過程,任務在調用時
不必擔心數據是否會出錯。因爲進程在收到信號後,就將跳轉到信號處理
函數去接着執行。如果信號處理函數中使用了不可重入函數,那麼信號
處理函數可能會修改原來進程中不應該被修改的數據,這樣進程從信號
處理函數中返回接着執行時,可能會出現不可預料的後果。不可再入函數
在信號處理函數中被視爲不安全函數。
3、滿足下列條件的函數多數是不可重入的:
(1)使用靜態的數據結構,如getlogin(),gmtime(),getgrgid(),getgrnam(),
getpwuid()以及getpwnam()等等;
(2)函數實現時,調用了malloc()或者free()函數;
(3)實現時使用了標準I/O函數的
*/
/*
點分十進制字符串與32位的網絡字節序二進制值轉換IPV4地址
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);
char *inet_ntoa(struct in_addr in);
in_addr_t inet_network(const char *cp);
struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host);
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);
注意:
char *inet_ntoa(struct in_addr in);
1)函數返回值指向的字符串駐留在靜態內存中,是不可重入的,
2)函數的參數是一個結構體,而不是指針.
答案:正常使用應該是傳入一個指針,主調函數分配內存,使用完再釋放!
linux內核不這麼做,你就分配個內存給到我,我給你轉一把,然後把
內存地址給到你,其實還是你分配的那個內存。
借用了你分配的內存了。
*/
#if 0
void test()
{
const char *cp = "192.168.66.128";
struct in_addr inp;
int ret;
ret = inet_aton(cp, &inp);
if(ret == 0)
{
printf("%s is invalid\n", cp);
}
/*
struct in_addr {
u_int32_t s_addr;
};
*/
printf("ip is %s\n", inet_ntoa(inp));
}
#endif
/*
p代表表達(presentation) n代表數值(numeric)
af argument must be either AF_INET or AF_INET6.
//點分十進制-》32位二進制IPV4或者
int inet_pton(int af, const char *src, void *dst);
const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
*/
//地址轉換函數
void test()
{
char ip[16] = {0};
char addptr[16] = {0};
const char *cp = "192.168.66.128";
int ret;
socklen_t size = sizeof(ip);
char *p = NULL;
//AF_INET or AF_INET6.
ret = inet_pton(AF_INET, cp, (void *)addptr);
if (ret == 0)
{
printf("%s is invalid\n", cp);
return;
}
else if (ret == -1)
{
if (errno == EAFNOSUPPORT)
perror("不支持的協議族");
if (errno == ENOSPC)
perror("分配的內存不夠");
return;
}
if (ip != NULL)
{
p = (char *)inet_ntop(AF_INET, addptr, ip, size);
}
if (errno == ENOSPC)
{
perror("分配的內存size不夠");
return;
}
if (p != ip)
{
perror("inet_ntop");
return;
}
printf("ip is %s\n", ip);
}
int main()
{
test();
return 0;
}