编辑
我对下面看到的内容进行了更改,这就是我所拥有的
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string>
#include <vector>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <errno.h>
using namespace std;
string buffer;
vector<string> ex;
int s;
void recvline ( int s, string* buf ) {
char in, t;
while ( 1 ) {
recv ( s, &in, 1, 0 );
*buf += in;
if ( in == 10 ) {
t = 1; }
if ( t && in == 13 ) {
break; }
}
}
void push ( int s, string msg ) {
string o = msg + "\r\n";
cout << "SENT:", o;
send ( s, o.c_str(), o.size(), 0 );
}
int main ( int argc, char *argv[] ) {
if ( argc < 3 ) {
cout << "Insufficient Arguments" << endl;
exit ( 7 ); }
s = socket ( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( s < 0 )
exit ( 1 );
struct hostent h = *gethostbyname ( argv[1] );
struct sockaddr_in c;
c.sin_family = AF_INET;
c.sin_port = htons(atoi(argv[2]));
c.sin_addr.s_addr = inet_addr ( h.h_addr_list[0] );
if ( connect ( s, (struct sockaddr*)&c, sizeof c ) != 0 ) {
cout << "Unable to connect to network" << endl;
cout << strerror(errno) << endl;
exit ( 2 );
}
push ( s, "USER LOLwat Lw lol.wat :LOLwat" );
push ( s, "NICK LOLwat" );
while ( true ) {
recvline ( s, &buffer );
cout << buffer;
if ( buffer.substr(0,4).c_str() == "PING" )
push ( s, "PONG " + buffer.substr(6,-2) );
}
}
结果如下:
[dbdii407@xpcd Desktop]$ g++ ?.cpp -o 4096 -
[dbdii407@xpcd Desktop]$ ./4096 irc.scrapirc.com 6667 - Unable to connect to network - Network is unreachable
最佳答案
我认为问题是这一行:
c.sin_port = htons(*argv[2]);
没有按照自己的想法去做。
argv[2]
是字符串,*argv[2]
是字符串的第一个字符。因此,如果您将“4567”作为第二个命令行参数传递,那么*argv[2]
将为“4”,其ASCII值为52。这意味着您将尝试连接到端口52,而不是您期望的“4567”。将行更改为:
c.sin_port = htons(atoi(argv[2]));
atoi函数采用字符串并将其转换为整数。因此,“4567”将变为4567。
同样,通常,当这样的函数调用失败时,您应该检查
errno
的值(通常会在the documentation中告诉您是否设置了errno以及可以将其设置为可能的值)。这应该有助于将来为您提供一些线索。编辑
正如其他人指出的那样,请确保您注意大括号。如果只在
if
,while
等周围使用花括号,通常会更容易。也就是说,这是:if ( connect ( s, (struct sockaddr*)&c, sizeof c ) != 0 )
cout << "Unable to connect to network" << endl;
exit ( 2 );
与此完全不同:
if ( connect ( s, (struct sockaddr*)&c, sizeof c ) != 0 ) {
cout << "Unable to connect to network" << endl;
exit ( 2 );
}