inet_ntop が失敗し、errno を「プロトコルでサポートされていないアドレス ファミリー」に設定するという問題があります。
受け入れコード:
//Wait for connection from client
Network.RemoteSock = accept(Network.LocalSock, (struct sockaddr *) &Network.RemoteAddr, &Network.RemoteAddr_Size);
if(Network.RemoteSock == -1) {
Die("accept Failed In Webserver: %s\n", strerror(errno));
}
//Set socket send timeout
if(setsockopt(Network.RemoteSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&Settings.Send_Timeout, sizeof(Settings.Send_Timeout)) == -1) {
Die("setsockopt Failed In Webserver: %s\n", strerror(errno));
}
//Set socket recv timeout
if(setsockopt(Network.RemoteSock, SOL_SOCKET, SO_RCVTIMEO, (char *)&Settings.Recv_Timeout, sizeof(Settings.Recv_Timeout)) == -1) {
Die("setsockopt Failed In Webserver: %s\n", strerror(errno));
}
//Get remote address
if(inet_ntop(Network.RemoteAddr.ss_family, get_in_addr((struct sockaddr *) &Network.RemoteAddr), Address, sizeof(Address)) == NULL) {
Die("inet_ntop Failed In Webserver: %s\n", strerror(errno));
}
ネットワークの定義:
struct _Network {
int LocalSock, RemoteSock;
struct sockaddr_storage RemoteAddr;
socklen_t RemoteAddr_Size;
} Network;
GDB で確認すると、inet_ntop を呼び出す前に Network.RemoteAddr.ss_family が 0 であることがわかります。
(gdb) print Network.RemoteAddr
$1 = {ss_family = 0, __ss_align = 0, __ss_padding = '\000' <repeats 111 times>}
ss_family の有効な値がわからないため、accept 呼び出しが失敗したことを意味するかどうかはわかりませんが、問題はそこにあるのではないかと思います。
おそらくどこかでばかげた問題になるでしょうが、私にはそれがわかりません。何かアイデアはありますか?
前もって感謝します - アレックス