IRCサーバーを監視するプログラムを作ろうとしているのですが、基本的な接続すらできず困っています。私は学校で Linux クラスターに取り組んでいます。
私は単に自分が間違っていることを知りません。これが私のコードで、C の TCP IP ソケットの第 2 章からほぼそのままコピーしたものです。
int main(int argc, char** argv)
{
char *servName = "irc.freenode.net";
in_port_t servPort = 6667;
//Start populating server information into a sockaddr
struct sockaddr_in servAddr;
memset(&servAddr, 0, sizeof(servAddr));
//To get the IP address of irc.freenode.net
//Using gethostbyname
char servIP[16];
struct hostent *hent;
hent = gethostbyname(servName);
inet_ntop(AF_INET, (void *)hent->h_addr_list[0],servIP,16);
//Convert the IP address's endianness
int rtnVal = inet_pton(AF_INET, servIP, &servAddr.sin_addr.s_addr);
if(rtnVal <= 0)
dieMsg("inet fail",rtnVal);
servAddr.sin_port = htons(servPort);
servAddr.sin_family = AF_INET;
printf("%s\n",servIP);
//End server information
//Open a socket to use
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock<0)
dieMsg("sock fail",sock);
//Connect using the sock, and the populated sockaddr struct.
if(connect(sock,(struct sockaddr*) &servAddr, sizeof(servAddr))<0);
{
dieMsg("con fail",-1);
}
return 0;
}
dieMsg
文字列と int を取り、それらを出力して終了する関数です。
このコードの出力は
89.16.176.16
con fail -1
または、構造体も使用しましたが、addrinfo
役に立ちませんでした。
int main(int argc, char** argv)
{
char *servHostc = "irc.freenode.net";
char *servPortc = "6667";
struct addrinfo addrCriteria;
memset(&addrCriteria, 0, sizeof(addrCriteria));
addrCriteria.ai_family = AF_INET;
addrCriteria.ai_socktype = SOCK_STREAM;
addrCriteria.ai_protocol = IPPROTO_TCP;
struct addrinfo *servAddr;
int rtnVal = getaddrinfo(servHostc,servPortc, &addrCriteria, &servAddr);
if(rtnVal != 0)
dieMsg("getaddrinfo() connect fail", rtnVal);
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(connect(sock, (struct sockaddr*) &servAddr, sizeof(servAddr) < 0))
{
free(servAddr);
dieMsg("Connect failed",-1);
}
return 0;
}
Telnet は両方のアドレスで機能するため、私のインターネット接続ではありません。
$ telnet irc.freenode.net 6667
Trying 128.237.157.136...
Connected to irc.freenode.net (128.237.157.136).
Escape character is '^]'.
:hubbard.freenode.net NOTICE * :*** Looking up your hostname...
:hubbard.freenode.net NOTICE * :*** Checking Ident
:hubbard.freenode.net NOTICE * :*** Found your hostname
^]
telnet> Connection closed.
$ telnet 89.16.176.16 6667
Trying 89.16.176.16...
Connected to wolfe.freenode.net (89.16.176.16).
Escape character is '^]'.
:wolfe.freenode.net NOTICE * :*** Looking up your hostname...
:wolfe.freenode.net NOTICE * :*** Checking Ident
:wolfe.freenode.net NOTICE * :*** Found your hostname
^]
telnet> Connection closed.
私は通常、質問をするのが嫌いなので、これは私の最後の手段です。誰かが私の苦境に光を当てることができれば、とても感謝しています.