DHCPパケットを送信するコードを書いていたら、どうも送信の部分が上手くいきませんでした。
通常通りUDPソケットを作って、作成したソケット、データ、sockaddr_inなどをsendtoで指定しました。ところが、実際に実行してみると、"permission denied"になって、思う通りにいきませんでした。最初がsendtoに指定する引数に問題があるのかなと思っていたのですが、DHCPサーバのIPアドレスを直接指定すると上手くいきました。
もう少し調べてみると、どうやらpermission deniedはsendtoのエラーではないみたいです。なのでそれ以外の箇所として思い当たったのが、 sockaddr_in.sin_addr.s_addr = INADDR_BROADCASTが怪しいと思いました。結果、その箇所に関連するコードが欠けていたため、上手く送信できませんでした。
気づくと「なんだそこか!」となるのですが、当方なかなか気づくのに時間がかかり、やられました。なので、シャアしたいと思います。
setsockopt (SO_BROADCAST)
setsockoptは、ソケットのオプションをいじる関数です。setsockoptで設定するフラグはいくつかあるのですが、その中にUDPでブロードキャストパケットを送信するためのフラグ( SO_BROADCAST )があります。
こんな感じです。
1 2 |
int flag=1; setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char *)&flag,sizeof(flag)) |
このコードを書き忘れてたために、permission deniedになってしまいました。
※実際にコードに書くときは、setsockopt関数の戻り値によるエラー処理も併せて書きます。
もしUDPでブロードキャストをするコードを書いていて、permittion deniedのエラーで躓いている場合は、上記の箇所を確認してみてください。
最後まで読んでいただきありがとうございました。