sockaddr_in server_addr, client_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr( server_ip.c_str() );
server_addr.sin_port = htons( atoi(argv[2]) );
bindRes = bind(sockHandle, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen( sockHandle, 10 );
clientSockHandle = accept(sockHandle, (struct sockaddr *) &client_addr, &clientSockLen);
Сокеты, и ECONNREFUSED на внешнем IP
Когда ставлю сервер на локалхост (т.е. server_addr.sin_addr.s_addr присваиваю inet_addr(127.0.0.1)) , то клиент на тотже локалхост по тому-же проту коннектится всё окей.
Однако когда ставлю сервер на свой внешний айпи , то при попытке подключиться клиентом на тот-же айпи, выдаёт ошибку ECONNREFUSED , что означает что "The target address was not listening for connections or refused the connection request".
Приходит в голову только то, что не так как надо ставлю сервер слушать .. Но в упор не могу понять в чём трабла.
Вот кусок кода серверной части:
Код:
А вот клиент:
Код:
this->sockHandle = socket(AF_INET, SOCK_STREAM, 0);
if (this->sockHandle < 0)
cout << "ERROR opening socket" << endl;
this->server = gethostbyname( sHost.c_str() );
if (this->server == NULL) {
cout << "ERROR, getting host by name "<< sHost << "\n" ;
exit(0);
}
memset( &this->server_address, 0, sizeof(this->server_address) );
this->server_address.sin_family = AF_INET;
this->server_address.sin_port = htons(this->port);
this->bConnected = (connect(this->sockHandle, (struct sockaddr *)&this->server_address, sizeof(this->server_address)) < 0) ? false:true;
if (this->sockHandle < 0)
cout << "ERROR opening socket" << endl;
this->server = gethostbyname( sHost.c_str() );
if (this->server == NULL) {
cout << "ERROR, getting host by name "<< sHost << "\n" ;
exit(0);
}
memset( &this->server_address, 0, sizeof(this->server_address) );
this->server_address.sin_family = AF_INET;
this->server_address.sin_port = htons(this->port);
this->bConnected = (connect(this->sockHandle, (struct sockaddr *)&this->server_address, sizeof(this->server_address)) < 0) ? false:true;
2. telnet на порт можно сделать?
3. файерволы имеются?
2. Можно
3. Да нету вроде.
Цитата:
memset( &this->server_address, 0, sizeof(this->server_address) );
this->server_address.sin_family = AF_INET;
this->server_address.sin_port = htons(this->port);
this->server_address.sin_family = AF_INET;
this->server_address.sin_port = htons(this->port);
Это понятно.
А где установка this->server_address.sin_addr.s_addr? Похоже, что клиент у тебя всё время коннектится по адресу 0.0.0.0.
PS. Есть такая вещь, называется strace. Запусти своего клиента через strace (вот так: strace твой-клиент аргументы-клиента) и увидишь, с какими параметрами вызывается connect.
Причём в клиенте указывал куда коннктиться, после запуска, типа connect 127.0.0.1 . И не понимал каким боком он коннектится на локалхост если вводить белиберду, типа connect 2 :D
И за strace спасибо.. Оч полезная штука :))