调用 inet_ntoa 程序崩溃

     调用 inet_ntoa 函数产生的段错误 “Segmentation fault (core dumped)” 的原因及解决办法

   原因是在64位机上运行, 32位上是没问题的,只要加上头文件 #include <arpa/inet.h>
``` int InitUDPServer(void) { int iRet = -1; int iSocket; int iFirstClient = -1; unsigned long long ulTotalBytes = 0; char cBuffer[cmnDfn_BUFF_LEN]; char cDataPacket[cmnDfn_BUFF_LEN]; struct sockaddr_in stServerAddr, stClientAddr ,stAllowedClientAddr; socklen_t Addrlen = sizeof(stClientAddr); struct timeval stStartTime,stEndTime; struct timeval stLastDisplayedTime = {0}; float fElapsedTime; float fNetSpeed; ssize_t ByteNum; // 创建套接字 iSocket = socket(AF_INET, SOCK_DGRAM, 0); if (iSocket < 0) { cmn_PrtError("socket error"); } // 设定服务器的地址端口 bzero(&stServerAddr, sizeof(stServerAddr)); stServerAddr.sin_family = AF_INET; stServerAddr.sin_port = htons(8080); stServerAddr.sin_addr.s_addr = INADDR_ANY; // 绑定套接字 if (bind(iSocket, (struct sockaddr *)&stServerAddr, sizeof(stServerAddr)) < 0) { cmn_PrtError("bind error"); } memset(cDataPacket, 0 ,sizeof(cDataPacket)); gettimeofday(&stStartTime, NULL); while (1) { // 接收数据包 while (ulTotalBytes < DATE_SIZE) { if ((ByteNum = (recvfrom(iSocket,cBuffer,sizeof(cBuffer),0, (struct sockaddr *)&stClientAddr, &Addrlen))) < 0) { cmn_PrtError("recvfrom error"); } ulTotalBytes += ByteNum; } gettimeofday(&stEndTime, NULL); // 首个客户端 if(iFirstClient) { memcpy(&stAllowedClientAddr,&stClientAddr,Addrlen); iFirstClient = 0; } // 与首个客户端匹配 if(stClientAddr.sin_addr.s_addr == stAllowedClientAddr.sin_addr.s_addr && stClientAddr.sin_port == stAllowedClientAddr.sin_port) { fElapsedTime = (stEndTime.tv_sec - stStartTime.tv_sec) + (stEndTime.tv_usec - stStartTime.tv_usec) / 1000000.0; // 计算并显示网速 fNetSpeed = (ulTotalBytes * 8) / (fElapsedTime * 1000 * 1000);//Mbps if (stEndTime.tv_sec-stLastDisplayedTime.tv_sec >= DISPLAY_INTERVAL) { printf("Net speed: %.2f Mbps\n", fNetSpeed); stLastDisplayedTime = stEndTime; ulTotalBytes = 0; // 重置累计字节数 stStartTime = stEndTime; // 重置开始时间 } //snprintf(cNetSpeed,cmnDfn_BUFF_LEN,"Network speed: %.2f Mbps",fNetSpeed); if(sendto(iSocket, cDataPacket, sizeof(cDataPacket), 0, (struct sockaddr *)&stClientAddr, Addrlen) < 0) { cmn_PrtError("sendto error"); } } else { // 非首个客户端,拒绝连接并打印拒绝信息 printf("Client %s:%d is not allowed\n",inet_ntoa(stClientAddr.sin_addr), ntohs(stClientAddr.sin_port)); } } iRet = 0; _Exit: if (iSocket >= 0) { close(iSocket); } return iRet; }```检查代码逻辑
03-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值