버그 해결을 위한 모든 질문을 던져
0 votes
238 views

안녕하세요.. 3일째 답을 못찾아서 이리저리 떠돌고있는 중생입니다.

소스코드가 의미가 있을까 싶긴 한 질문입니다만.. connect()에서 getLastError()을 찍어보니

10051이라는 에러가 뜨더군요. 확인해본 결과 'WSAENETUNREACH, 네트워크에 도달할 수 없음'

공식문서에 이렇게 나와있더라구요. 그냥 진짜 간단한 tcp 소켓 통신인데도 전달이 안됩니다 ㅠㅠ

이곳저곳 질문하면서 혹시나 답변자님에게 키워드가 될 수 있을법한 것들을 몇개 적어놓고 코드를 올리겠습니다.

일단 집에서 공유기를 사용하고 있긴 하지만 제 컴퓨터는 LAN선을 직접 연결하여 사용중입니다. 

Windows 10 사용중이고 딱히 포트포워딩이나 방화벽은 건들지 않았습니다. 

그리고 집에서 노트북으로 사용했을 때도 (wi-fi 사용) connect에서 같은 에러가 뜨더군요.

참고로 지금 올리는 코드는 예전에 독서실에서 노트북으로 했을 때는 결과가 나온 코드입니다. 집에서는 안되더라구요 ㅠ

 

//수정

inet_pton을 사용하니 에러가 해결된듯 합니다... 왜인지 모르겠습니다..

 

 

 

//서버

#include "pch.h"

#include <WinSock2.h>

#include <iostream>

#pragma comment (lib , "ws2_32.lib")



#define WINSOCK_DEPERECATED_NO_WARNINGS



void showError(const char * msg)

{

 std::cout << "에러 : " << msg << std::endl;

 exit(-1);

}



int main()

{

 WSADATA data;

 ::WSAStartup(MAKEWORD(2, 2), &data);



 SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);



 if (server == INVALID_SOCKET)

  showError("서버 생성 실패");



 sockaddr_in addr = { 0 };



 addr.sin_family = AF_INET;

 addr.sin_addr.s_addr = htonl(INADDR_ANY);

 addr.sin_port = htons(23000);



 if (bind(server, (sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)

  showError("바인딩 실패");



 if (listen(server, SOMAXCONN) == SOCKET_ERROR)

  showError("듣기 실패");



 std::cout << "클라이언트를 기다립니다.." << std::endl;



 SOCKET client = accept(server, NULL, NULL);

 closesocket(client);



 closesocket(server);

 ::WSACleanup();

 return 0;

}



// 클라이언트



#include "pch.h"

#include <WinSock2.h>

#include <iostream>

#pragma comment (lib , "ws2_32.lib")



void showError(const char * msg)

{

 std::cout << "에러 : " << msg << ", " << GetLastError() << std::endl;

 exit(-1);

}



int main()

{

 WSADATA data;

 ::WSAStartup(MAKEWORD(2, 2), &data);



 SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);



 if (client == INVALID_SOCKET)

  showError("클라이언트 생성 실패");



 sockaddr_in addr = { 0 };



 addr.sin_family = AF_INET;

 addr.sin_addr.s_addr = htonl(atoi("127.0.0.1"));

 addr.sin_port = htons(23000);



 if (connect(client, (sockaddr *)&addr, sizeof(addr)) == SOCKET_ERROR)

  showError("연결 실패");



 closesocket(client);

 ::WSACleanup();

 return 0;

}

 

asked (14 point)
재 태그 , 238 views

1 답변

0 votes
저 코드에서

addr.sin_addr.s_addr = htonl(atoi("127.0.0.1"));

이 부분이 잘못 되었습니다.   ip 주소 127.0.0.1 는 숫자가 아니기 때문에 atoi 로 변경이 안됩니다.

말씀처럼 inetpton 을 쓰시거나  예전방식으로 한다면  문자열 ip 주소를  4byte addr 로 변경시켜주는 inet_addr 함수를 쓰셔야 합니다.
answered (265 point)
ㅋㅋㅋㅋ 감사합니다!

생각해보니까 그렇네요... 왜 저렇게 때려박았는지 ;

또 왜 됐었는지도 의문이었네요 .. 덕분에 궁금한게 해결됐습니다 감사합니다!!

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

338 질문
460 answers
471 댓글
1,109 users