代码测试片段
第一章.文件写入
1.文件写入
测试写入文件代码片段。
{
FILE *pFp;
pFp = fopen("/var/test.log", "w+");
fprintf(pFp, "server_addr2: %s\n", server_addr2);
fprintf(pFp, "server_addr3: %s\n", server_addr3);
fclose(pFp);
}
2.读取文件内容
第二章.网络
1.判断ipv4地址
int ret = 0;
char *v4IPAddr = "192.168.137.1";
INT8U iV4IPAddress[16];
ret = inet_pton(AF_INET, (char *)v4IPAddr, iV4IPAddress);
if(ret <= 0)
{
printf("invalid ipv4 address...\n");
}
2.判断ipv6地址
int ret = 0;
char *v6IPAddr = "xx::xx::xx::";
INT8U iV6IPAddress[46];
ret = inet_pton(AF_INET6, (char *)v6IPAddr, iV6IPAddress);
if(ret <= 0)
{
printf("invalid ipv6 address...\n");
}
3.判断domain域名
int ret = 0;
char *domainAddress = "www.baidu.com";
struct addrinfo *pAddrinfo;
INT8U iV6IPAddress[46];
ret = getaddrinfo((char *)domainAddress, NULL, NULL, &pAddrinfo);
if(ret <= 0)
{
printf("invalid domain address...\n");
}
4.ip到域名与域名到ip测试
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include<netdb.h>
int ip_to_hostname(char *ip)
{
int ret = 0;
//int getaddrinfo( const char *hostname, const char *service,
//const struct addrinfo *hints, struct addrinfo **result );
struct addrinfo *res, *res_p;
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME | AI_NUMERICHOST;
hints.ai_protocol = 0;
ret = getaddrinfo(ip, NULL, &hints, &res);
if (ret != 0) {
printf("getaddrinfo[ip to hostname]: %s,return\n", gai_strerror(ret));
return -1;
}
for (res_p = res; res_p != NULL; res_p = res_p->ai_next) {
char host[1024] = {0};
ret = getnameinfo(res_p->ai_addr, res_p->ai_addrlen, host, sizeof(host), NULL, 0, NI_NAMEREQD);
if(ret != 0)
printf("getnameinfo: %s\n", gai_strerror(ret));
else
printf("hostname: %s\n", host);
}
freeaddrinfo(res);
return ret;
}
int hostnameToIp(char *hostname)
{
int ret = 0;
//int getaddrinfo( const char *hostname, const char *service,
//const struct addrinfo *hints, struct addrinfo **result );
struct addrinfo *res, *res_p;
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME;
hints.ai_protocol = 0;
ret = getaddrinfo(hostname, NULL, &hints, &res);
if (ret != 0) {
printf("getaddrinfo: %s , return\n", gai_strerror(ret));
return -1;
}
for (res_p = res; res_p != NULL; res_p = res_p->ai_next) {
char host[1024] = {0};
ret = getnameinfo(res_p->ai_addr, res_p->ai_addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST);
if(ret != 0)
printf("getnameinfo: %s\n", gai_strerror(ret));
else
printf("ip: %s\n", host);
}
freeaddrinfo(res);
return ret;
}
int main()
{
//int getaddrinfo( const char *hostname, const char *service,
//const struct addrinfo *hints, struct addrinfo **result );
printf("============test ip to hostname==================\n");
//ip_to_hostname("192.168.18.204");
//ip_to_hostname("127.0.0.1");
ip_to_hostname("192.168.18.24");
printf("============test hostname to ip==================\n");
hostnameToIp("www.baidu.com");
return 0;
}
测试结果:
5.gethostbyname
注意该函数不是线程安全的。例如在rsyslog-8.4.2
中描述:
第三章.硬件测试
void *testeeprom(void *pArg)
{
char BusName[64];
INT8U SlaveAddr = 0xa8;
INT8U WR_BUF[64];
INT8U WR_Count;
INT8U RD_BUF[1024];
int RD_Count = 402;
int i = 0;
sleep(10);
INT8U RD_BUFTmp[1024];
WR_Count = 2;
sprintf(BusName,"/dev/i2c%d",0);
if((i2c_master_readwrite (BusName,SlaveAddr>>1, WR_BUF, RD_BUF, WR_Count, RD_Count) <0)
{
printf("Read eeprom Fail\n");
}
memcpy(RD_BUFTmp,RD_BUF,402);
printf("eeprom data....\n");
for(i = 0 ; i < 32 ; i ++)
{
printf("0x%02x ",RD_BUFTmp[i]);
}
printf("\n");
for(i = 32 ; i < 64 ; i ++)
{
printf("0x%02x ",RD_BUFTmp[32 + i]);
}
printf("\n");
{
FILE *pFp;
pFp = fopen("/var/test.log", "w+");
for(i = 0 ; i < 402 ; i ++)
{
fprintf(pFp,"%02x ",RD_BUFTmp[i]);
}
fclose(pFp);
}
while(1)
{
WR_BUF[0] = 0;
WR_BUF[1] = 0;
if(i2c_master_readwrite (BusName,SlaveAddr>>1, WR_BUF, RD_BUF, WR_Count, RD_Count) <0)
{
printf("Read eeprom Fail\n");
}
for(i = 0 ; i < 402 ; i ++)
{
if(RD_BUF[i] != RD_BUFTmp[i])
{
{
printf("eeprom data is not right....\n");
{
FILE *pFp;
pFp = fopen("/var/test1.log", "w+");
for(i = 0 ; i < 1024 ; i ++)
{
fprintf(pFp,"%02x ",RD_BUF[i]);
}
fclose(pFp);
}
while(1){
printf("eeprom data is not right....\n");
sleep(1);
}
}
return NULL;
}
}
sleep(1);
}
}
第四章: 信号捕捉
1.信号捕捉代码
int InstallSignal(int SigNum,void (*sighandler)(int sig))
{
struct sigaction action;
action.sa_handler = sighandler;
(void)sigfillset( &action.sa_mask );
action.sa_flags = SA_RESTART;
if( sigaction( SigNum, &action, NULL ) < 0 )
{
printf ( "Cannot catch signal SigNum %d\n",SigNum);
}
return 0;
}
调用方法:
InstallSignal(SIGSEGV, sigsegv);
其中:
static void sigsegv(/*int i*/)
{
//print_backtrace();
void *pBuf[ADDR_MAX_NUM] = {0};
int iAddrNum = backtrace(pBuf, ADDR_MAX_NUM);
printf("BACKTRACE: NUMBER OF ADDRESSES IS:%d\n\n", iAddrNum);
char ** strSymbols = backtrace_symbols(pBuf, iAddrNum);
if (strSymbols == NULL) {
printf("BACKTRACE: CANNOT GET BACKTRACE SYMBOLS\n");
return;
}
int ii = 0;
for (ii = 0; ii < iAddrNum; ii++) {
printf("%03d %s\n", iAddrNum-ii, strSymbols[ii]);
}
printf("\n");
free(strSymbols);
strSymbols = NULL;
}