2015-03-23 1 views
-1

Я использую компилятор g++ 4.9.2 и написал следующий код, чтобы попробовать мой первый пример с сокетами.Почему я не подключаюсь к серверу?

char *buf = new char[1000]; 
int iResult; 

int main(){  
    WSADATA wsaData; 
    SOCKET ConnectSocket = INVALID_SOCKET; 
    addrinfo hints, *result; 
    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 
    std::cout << WSAStartup(MAKEWORD(2,2), &wsaData) << std::endl; 
    iResult = getaddrinfo("173.194.40.231", "80", &hints, &result); 
    std::cout << iResult; 
    ConnectSocket = socket(result -> ai_family, result -> ai_socktype, result -> ai_protocol); //1, HERE 
    connect(ConnectSocket, result->ai_addr, result->ai_addrlen); 
} 

вопрос, который я получил Segmentation fault в 1. Из-за getaddrinfo("173.194.40.231", "80", &hints, &result); вернулся 11003, поэтому &result указал на NULL. Зачем? Я набрал действительный адрес и порт.

Это было google.com, и мы можем открыть его в браузере. Не мог бы кто-нибудь помочь мне?

+0

Что говорит ваш отладчик? Где ваши '# include'? Какой результат вы получаете до segfault (если есть)? –

+2

'Проблема, что я получил ошибку сегментации в 1' Первое, что вы должны сделать, никогда не предполагают, что все будет работать. Вы должны проверить свои возвращаемые значения, а не предполагать, что все в порядке. Вы также можете вызвать 'WSAGetLastError', когда это произойдет. – PaulMcKenzie

+0

@LightnessRacesinOrbit Мой отладчик сказал, что я написал в сообщении. Что еще можно сказать? – user3663882

ответ

1
memset(&hints, 0, sizeof(hints)); 

getaddrinfo() пытается заполнить существующие данные. Данные мусора запутывают функцию.

+0

Это также сработало бы: 'addrinfo hints = addrinfo();' – PaulMcKenzie

+0

@PaulMcKenzie Зачем нам это делать? «Addrinfo hints»: декларация уже вызывает инициализацию по умолчанию? – user3663882

+0

@ user3663882 Нет, декларация сама по себе (без круглых скобок) не делает этого - вы заканчиваете барахлом, как говорит ответ. Добавление скобок по умолчанию инициализирует структуру, которая делает эти члены все 0. – PaulMcKenzie

Смежные вопросы