2016-09-08 3 views
0

Так что я хочу запустить живой сервер на своем компьютере, чтобы подключиться и получить информацию от кого-то еще. Я думал, что могу позволить другому человеку подключиться к моему ip-адресу на порте, который не используется. Например, если мой гипотетический ip-адрес - 214.231.34.12 и порт 50000, и я открываю соединение и передаю эту информацию кому-то, они могут подключиться к нему и отправить мне информацию через TCP.Как запустить живой сервер win 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 для меня совершенно незначителен, и я не понимаю, как я должен поступить иначе. Я знаю, что этот код еще не получает никакой информации, это просто связь, с которой я пытаюсь работать в данный момент. Разве это не правильный способ установить это?

Привязать() завершается с ошибкой Windows Socket 10049

+1

Это ваш код или вы его откуда-то взяли? – Hayt

+1

Является ли 214.231.34.12 IP вашего ПК или вашего маршрутизатора, который делает NAT? Если вы находитесь за маршрутизатором с NAT, вам необходимо настроить перенаправление портов. Кроме того, не привязывайте ваш сокет к IP-адресу, просто используйте 'INADDR_ANY', это упростит, если есть NAT или ваш IP-изменения. Кроме того, сначала проверьте вашу программу локально. –

+1

Продолжайте читать свою книгу о сокетах. вы достигнете программирования http, а затем, возможно, сможете это сделать. не смешивайте между http и tcp-udp/ip. – Raindrop7

ответ

1

Есть много препятствий для установления соединения TCP через Интернет:

  1. Интернет сам по себе: плохой/нестабильная связь, динамические IP-адреса и т.д.
  2. ISP: возможно, ваш провайдер блокирует некоторые порты или ЖК-
  3. маршрутизатор: маршрутизатор брандмауэра, проблемы обхода NAT, UPnP, и т.д.
  4. ОС: Windows брандмауэр, антивирус, Por т заблокирован/в использовании
  5. СВОЮ APP: может быть, код ошибки

ли совершенно новый мир ссылку на ПК через интернет, концепция является тем же самым, но реализовать его ......

+0

Спасибо, я проверил эти вещи. У меня есть статический ip и хорошее соединение, и я открыл порт 5000 на модеме/маршрутизаторе. Но да, может быть, что-то не так. –

+2

Я предлагаю: протестировать вашу программу внутри вашей сети, в этом случае ваш «серверный» ip должен быть чем-то вроде 192.168.0.2. Когда это работает, попробуйте обход маршрутизатора, в этом случае ваш IP-адрес сервера должен быть 214.231.34.12 (или что-то вроде этого). НО ОБА PCS (сервер и клиент) должны находиться внутри вашей сети. И когда это работает, попробуйте полное подключение к Интернету (оба ПК в разных сетях) –

0

Так что это может быть ответ, но, возможно, мне нужно использовать другой порт, как предположил датволф.

Я обнаружил, что невозможно привязать к ipaddress моего ISP. Так что я жду порт я хочу использовать, а затем подключить к 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 и порту 50000 с telnet, соединение работает! Мне просто интересно, является ли это правильным результатом?

+1

Подождите секунду: Вы на самом деле пытались привязать адрес, который не является вашим компьютером? Вы можете привязываться только к адресам машины, на которой работает программа. Ваш интернет-провайдер, вероятно, назначает вашему маршрутизатору общедоступный адрес, но в вашей сети вы находитесь в частном диапазоне адресов, и вы можете, конечно, привязываться только к этому. Если это так, то переадресация портов, как вы делали, - это только * действительный способ для этого. В этом случае также не рекомендуется явно привязываться к определенному адресу, а просто привязывать к 0.0.0.0, который является «всем адресом этой машины». – datenwolf

+0

Да, я не знал, что это невозможно, но теперь я благодарю! Учебник я следил только за связью с localhost и подключался к ip-адресам веб-сайта. Но я довольно новичок в этом, поэтому решил, что мне нужно привязать сервер к тому же ip-адресу, что и тот, к которому я хочу подключиться. Но я был не прав;) О, спасибо, да, лучше привязать к 0.0.0.0! –

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