2016-09-08 5 views
0

그래서 내 PC에서 라이브 서버를 실행하여 다른 사람에게 정보를 연결하고 싶습니다. 다른 사람이 사용하지 않는 포트에서 내 IP 주소에 연결할 수 있다고 생각했습니다. 예를 들어 가상 IP 주소가 214.231.34.12이고 포트 번호가 50000인데 누군가가이 정보를 제공하면 TCP에 연결하여 정보를 보낼 수 있습니다. 라이브 서버를 실행하는 방법 winsock을 얻으려면?

는 내가이 코드를 사용할 수 있다고 생각 :

// TCPClient.cpp : Defines the entry point for the console application. 
// 
#include "stdafx.h" 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 
/* 
Live Server on port 50000 
*/ 
#include<io.h> 
#include<stdio.h> 
#include<winsock2.h> 

#pragma comment(lib,"ws2_32.lib") //Winsock Library 

int main(int argc, char *argv[]) 
{ 
    WSADATA wsa; 
    SOCKET s, new_socket; 
    struct sockaddr_in server, client; 
    int c; 
    char *message; 

    printf("\nInitialising Winsock..."); 
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) 
    { 
     printf("Failed. Error Code : %d", WSAGetLastError()); 
     return 1; 
    } 

    printf("Initialised.\n"); 

    //Create a socket 
    if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
    { 
     printf("Could not create socket : %d", WSAGetLastError()); 
    } 

    printf("Socket created.\n"); 

    //Prepare the sockaddr_in structure 
    server.sin_addr.s_addr = inet_addr("214.231.34.12"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(50000); 

    //Bind 
    if (bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) 
    { 
     printf("Bind failed with error code : %d", WSAGetLastError()); 
     exit(EXIT_FAILURE); 
    } 

    puts("Bind done"); 

    //Listen to incoming connections 
    listen(s, 3); 

    //Accept and incoming connection 
    puts("Waiting for incoming connections..."); 

    c = sizeof(struct sockaddr_in); 

    while ((new_socket = accept(s, (struct sockaddr *)&client, &c)) != INVALID_SOCKET) 
    { 
     puts("Connection accepted"); 

     //Reply to the client 
     message = "Hello Client , I have received your connection. But I have to go now, bye\n"; 
     send(new_socket, message, strlen(message), 0); 
    } 

    if (new_socket == INVALID_SOCKET) 
    { 
     printf("accept failed with error code : %d", WSAGetLastError()); 
     return 1; 
    } 

    closesocket(s); 
    WSACleanup(); 

    return 0; 
} 

를하지만 연결을 바인딩에 실패합니다. 이 전체 TCP 및 winsocket 물건은 나에게 완전히 새로운 것이고 나는 어떻게 다르게 접근해야하는지 이해하지 못합니다. 나는이 코드가 아직 어떤 정보도받지 못하고 있다는 것을 알고있다. 나는 그 순간에 일하려고하는 연결 일 뿐이다. 이것이 이것을 설정하는 올바른 방법이 아닌가?

바인드()는 윈도우 소켓 오류와 함께 실패 10049

+1

이 코드입니까? 아니면 어딘가에서 가져 왔습니까? – Hayt

+1

214.231.34.12는 NAT를 수행하는 PC 또는 라우터의 IP입니까? NAT가있는 라우터 뒤에 있다면 포트 포워딩을 구성해야합니다. 또한 IP를 소켓에 묶지 말고'INADDR_ANY' 만 사용하면 NAT가 관련되어 있거나 IP가 바뀌면 쉽게 할 수있다. 또한 프로그램을 로컬에서 먼저 테스트하십시오. –

+1

소켓에 관한 책을 계속 읽으십시오. http 프로그래밍에 도달하면 어쩌면 그렇게 할 수있을 것입니다. http와 tcp-udp/ip를 혼용하지 마십시오. – Raindrop7

답변

1

인터넷을 통해 TCP 연결을 설정하기위한 장애물의 많음이있다 :

  1. 인터넷 자체 : 등 나쁜/불안정한 연결, 동적 IPS,
  2. ISP : 어쩌면 당신의 ISP 블록 일부 포트 또는
  3. 라우터 IPS : 윈도우 방화벽, 안티 바이러스, 포 :
  4. OS 라우터 방화벽, NAT 통과 문제, UPnP를, 등 t이 사용/
  5. 앱 차단 :

이 개념은 같은 인터넷을 통해 PC에 완전히 새로운 세계 링크입니다 아마 코드 실수를하지만,

+0

고마워. 나는 그 것들을 점검 할 것이다. 고정 IP와 연결이 잘되어 있고 모뎀/라우터에 포트 5000을 열었습니다. 하지만 네, 거기에 더 많은 것들이 잘못 될 수 있습니다 –

+2

나는 귀하의 네트워크에서 귀하의 프로그램을 테스트합니다.이 경우 "서버"ip는 192.168.0.2와 같아야합니다. 그것이 작동하면 라우터 통과를 시도하십시오.이 경우 서버 IP는 214.231.34.12 (또는 이와 비슷한 것) 여야합니다.하지만 PCS (서버 및 클라이언트)는 모두 네트워크 내에 있어야합니다. 그리고 그것이 작동하면 풀 인터넷 연결을 시도하십시오 (다른 네트워크에서 두 PC 모두) –

0
...... 그것을 구현

답변 일 수도 있지만, 아마도 datenwolf가 제안한대로 다른 포트를 사용해야 할 수도 있습니다.

ISP의 ipaddress에 바인드 할 수 없다는 것을 발견했습니다. 여기에 언급 그래서 나는 앞으로 내가 사용하고 컴퓨터의 IPADDRESS 연결하려는 포트가 :

connecting to an IP address instead of localhost?

나는 것을 시도했다, 그래서 나는에 코드에서 IPADDRESS을 변경 :

//Prepare the sockaddr_in structure 
    server.sin_addr.s_addr = inet_addr("192.168.178.93"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(50000); 

그리고 214.231.34.12에 연결하고 telnet으로 포트 50000에 연결하면 연결이 작동합니다! 이것이 유효한 결과인지 궁금합니다.

+1

잠깐 기다려보십시오. 실제로 컴퓨터 중 하나가 아닌 주소에 바인딩을 시도 했습니까? 프로그램이 실제로 실행중인 컴퓨터의 주소에만 바인딩 할 수 있습니다. 귀하의 ISP는 아마도 공유기에 공용 주소를 할당하고있을 것입니다. 그러나 귀하의 네트워크 내에서 사설 주소 범위에 있으며 물론 그 주소에만 바인드 할 수 있습니다. 그렇다면 포트 포워딩은이 작업을 수행하는 유일한 방법입니다. 이 경우 특정 주소에 명시 적으로 바인딩하지 말고 0.0.0.0 인 "this this machine of all this address"에 바인드하는 것이 좋습니다. – datenwolf

+0

예, 가능하지 않다는 것을 몰랐지만 지금은 감사드립니다! 자습서는 localhost에 연결되어 있고 웹 사이트의 IP 주소에만 연결되어 있습니다. 하지만 나는 이것에 상당히 익숙하다. 그래서 나는 클라이언트가 연결되기를 원하는 것과 동일한 IP 주소로 서버를 묶어야 만한다는 것을 알았다. 하지만 내가 틀 렸어;) 오, 고마워 그럼 네, 그것은 0.0.0.0에 묶는 것이 낫다! –