我遇到了必须开发的应用程序的客户端问题。
我必须实施的第一阶段是对网络进行“扫描”,搜索其他用户。我决定使用UDP套接字,它们正常工作。如果我使用广播IP地址(getnamebyhost(“192.168.1.255”)),它工作正常。问题是应用程序必须在不同的网络上工作,我不知道IP地址(192.168或10.0或其他)。我必须学习地址,所以我在网上发现使用getifaddr()。这是代码:
#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <string.h>
int FindMyIp();
int IsConnected();
char *myIpAddr, *myMask, *myBroad;
int main (int argc, const char * argv[]) {
int checkConnection=0;
checkConnection = IsConnected();
while (checkConnection == 0) {
printf("Checking again..\n");
checkConnection = IsConnected();
sleep(2);
}
checkConnection=0;
printf("\nConnected to a new network..\n");
while (checkConnection == 0) {
checkConnection = FindMyIp();
if (checkConnection==0) { sleep(2); }
}
printf("My IP is %s\n", myIpAddr);
printf("My Mask is %s\n", myMask);
printf("The Broadcast IP is %s\n", myBroad);
return 0;
}
int IsConnected()
{
if (system("ping -c 1 www.google.com")){
return 0;
}
else {
return 1;
}
}
int FindMyIp()
{
struct ifaddrs * ifAddrStruct=NULL;
struct ifaddrs * ifa=NULL;
void * tmpAddrPtr=NULL;
printf("Acquiring interface information.. ");
getifaddrs(&ifAddrStruct);
printf("Checking for wanted interface..\n");
int i=0, connected=0;
ifa = ifAddrStruct;
while (i!=1) {
if ((ifa ->ifa_addr->sa_family==AF_INET)&&(ifa->ifa_name[0]=='e')&&(ifa->ifa_name[1]=='n')&&(ifa->ifa_name[2]=='1')) {
i=1;
connected=1;
}
else {
if (ifa->ifa_next == NULL) {
printf("error");
return connected;
}
ifa = ifa->ifa_next;
}
}
char addressBuffer1[INET_ADDRSTRLEN];
char addressBuffer2[INET_ADDRSTRLEN];
char addressBuffer3[INET_ADDRSTRLEN];
tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer1, INET_ADDRSTRLEN);
myIpAddr = addressBuffer1;
tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_netmask)->sin_addr;
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer2, INET_ADDRSTRLEN);
myMask = addressBuffer2;
tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_broadaddr)->sin_addr;
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer3, INET_ADDRSTRLEN);
myBroad = addressBuffer3;
return connected;
}
所以在myBroad中我应该已经保存了广播的ip地址,而且,我可以用printf打印它,但当我把它传递给socket时:struct hostent * hptr = gethostbyname(myBroad);它不会起作用! 哪里出错?
由于
答案 0 :(得分:1)
myIpAddr = addressBuffer1;
在这里,您要设置一个全局指针,指向FindMyIP函数内的本地缓冲区。当函数结束时,该数组就消失了。
只需将所有全局char *myIpAddr, *myMask, *myBroad;
数组生成,并将字符串直接放入其中,而不是本地地址缓冲区/ 2/3
答案 1 :(得分:0)
char * myBroad只是一个地址持有者,在函数结束后会丢失其值。实际上,您需要创建一个字符串数组并将其传递给socket API的其他函数。希望这有帮助!