TCP 연결에는 2 개의 동일한 끝이 있으며, 일단 확립되면 서로 구별 할 수 없습니다. 양쪽 끝은 다른 컴퓨터가 데이터를 보내야하는 IP 주소와 포트 번호를 가지고 있습니다.
connect
기능은 클라이언트에게 서버가
bind
기능을 인식하는 IP 주소와 포트를 알려줍니다 IP 주소와 포트가 서버의 응답을 대기해야하는 클라이언트를 알려줍니다. bind()
으로 전화하지 않으면 운영 체제가 자동으로 적절한 값을 선택합니다.
문제는 운영 체제가 잘못된 기본 IP 주소를 선택하고 있다는 것입니다. 여기가 바인드 함수가 들어있는 곳입니다.
아래는 192.168.100.2
의 주소에 바인드되는 (테스트되지 않은) 코드의 수정본입니다. 이 주소를 사용하려는 인터페이스에 속한 주소로 변경해야합니다.
터미널을 열고 ifconfig -a
을 입력하면 모든 인터페이스와 각 인터페이스에 속한 IP 주소의 목록이 인쇄됩니다. 다음 코드의 값 192.168.100.2
을 사용하려는 인터페이스에 속한 IP 주소로 바꿔야합니다.
int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr, local_addr; //Added a new variable in here for our local address
host = gethostbyname("192.168.100.4"); //This is the address of the server we are connecting to
cout << "Start" << endl;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
// perror("Socket");
cout << "Socket error" << endl;
exit(1);
}
//Now we want to bind an IP address
//This is an IP address that belongs to your computer, that will be used as the reply IP address
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = inet_addr("192.168.100.2"); //CHANGE THIS: this is an address on your computer
local_addr.sin_port = htons(0); //Leave this as 0 and the operating system will choose a unused one for you
if bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1)
{
// perror("Bind");
cout << "Bind error" << endl;
exit(1);
}
//Set up the structure that tells us what server to connect to
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(30002);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
//And connect to the server
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
// perror("Connect");
cout << "Connect error" << endl;
exit(1);
}
또한 TCPClient로서? – JavaCake
@JavaCake 예, 드물게 목적지에 도달 할 수있는 인터페이스가 둘 이상인 경우에도 서버에 연결할 때 바인드 기능이 작동합니다. 사용법은 똑같습니다. connect()를 호출하기 전에 socket()을 만든 다음 bind()를 호출하십시오. –
트릭을 수행해 주신 고마워요 .- – JavaCake