CFSOCKETSETADDRESSは、ホストコンピューターIPでなければ失敗しますか?
-
25-10-2019 - |
質問
簡単なWOLアプリケーションを作成しています。これまでのところ、ソケットを正常に作成できますが、CFSocketSetAddressを使用してアドレスを設定するときは、コンピューターのネットワークIP(WiFi IP = 192.168.0.5)またはローカルIP(127.0.0.1)のみを使用できます。
WOLについては、データをブロードキャストアドレス(255.255.255.255)に送信したいと思います。これが入力された場合、エラー「アドレスを設定できなかった」と返されます。
CFSocketSetAddressの使用を誤って理解していますか?アドレスはホストIPまたは宛先IPであると考えられていますか?どちらの場合でも、宛先IPがブロードキャストアドレスになるように、何をする必要がありますか?
以下は私のコードの一部です:
/*************************************************************************/
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT); //port
inet_aton(IP, &addr.sin_addr);//IP is the host network ip: 192.168.0.5
NSData *address = [NSData dataWithBytes: &addr length: sizeof(addr)];
if (CFSocketSetAddress(WOLsocket, (CFDataRef)address) != kCFSocketSuccess){
NSLog(@"Address could not be set!");
}
解決
別の方法(ネイティブソケットを取得)を使用して問題を解決し、CFSocketSetAddressを使用する代わりに、CFSocketsendDataの2番目の引数でアドレスを渡しました。
ヘビーグーグルの日々からHDDに保存されているコードがあるため、変更のリンク/参照はありません。
私の前から私を正しい方向に向けてくれたデビッド・ゲルハールに感謝したいと思います 質問.
これを必要とするかもしれない他の誰にとっても、これは私のコードです。
//Gets native & sets options
/*************************************************************************/
int desc = -1;
desc = CFSocketGetNative(WOLsocket);
int yes = 1;
if (setsockopt (desc, SOL_SOCKET, SO_BROADCAST, (char *)&yes, sizeof (yes)) < 0) {
NSLog(@"Set Socket options failed");
return EXIT_FAILURE;
}
//sets address socket - doesn't bind this is done in CFSocketSendData
/*************************************************************************/
unsigned long bcast = 0xffffffff;
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT); //port
addr.sin_addr.s_addr = bcast;
NSData *address = [NSData dataWithBytes: &addr length: sizeof(addr)];
//Sends Data
/*************************************************************************/
char ethadd []= "helloworld";
CFDataRef Data = CFDataCreate(NULL, (const UInt8*)ethadd, sizeof(ethadd));
if (CFSocketSendData(WOLsocket, address, Data, 0) < 0){
NSLog(@"Data could not be sent!");
return EXIT_FAILURE;
}
else NSLog(@"Data Sent");
}
他のヒント
私のアプリでは、問題はサンドボックス化されたことですが、ネットワークの権限は与えられていませんでした。
アプリサンドボックスを使用している場合、これらのいずれかを確認する必要があります。
所属していません StackOverflow