2015-07-09 5 views
1

Привета Я новичок в программировании сокетов, и я пытаюсь нижеследующий кодом из учебника по http://www.binarytides.com/winsock-socket-programming-tutorial/C программирование гнезда под окнами

Я пытаюсь подключиться к серверу, и я с помощью IP-адрес google. Вот код:

#include<stdio.h> 
#include<winsock2.h> 

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

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

    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"); 


    server.sin_addr.s_addr = inet_addr("74.125.224.72"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(80); 

    //Connect to remote server 
    if (connect(s, (struct sockaddr *)&server , sizeof(server)) < 0) 
    { 
     puts("connect error"); 
     return 1; 
    } 

    puts("Connected"); 

    return 0; 
} 

Пока сокет может быть создан, но я не могу подключиться к серверу. Чтобы быть более конкретным, я всегда выхожу и имею следующее:

Программа «[2060] SocketCTest.exe: Native» вышла с кодом 1 (0x1).

, даже если я установил точку останова перед возвратом.

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms741580%28v=vs.85%29.aspx –

+0

Не забудьте 'closesocket (s);' и 'WSACleanup();' перед каждым возвратом 'заявление. – CristiFati

+0

Попробуйте обнулить «сервер» перед его инициализацией (например, memset (& server, 0, sizeof server)). – Stuart

ответ

0

Ошибка. Я пробовал на своем компьютере и подключался с ошибкой (WSAETIMEDOUT). Я не уверен, есть ли сетевые настройки на моем компьютере, прокси, брандмауэры и т. Д .; или что хост google настроен не принимать прямые подключения сокета.

Во всяком случае, вот ваш код с некоторыми небольшими корректировками:

#include <stdio.h> 
#include <conio.h> 
#include <winsock2.h> 
#pragma comment(lib, "ws2_32.lib") //Winsock Library 

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

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

    printf("Initialised.\n"); 

    //Create a socket 
    if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) 
    { 
     printf("Could not create socket : %d.\n", WSAGetLastError()); 
     WSACleanup(); 
     c = getch(); 
     return 1; 
    } 
    printf("Socket created. Connecting...\n"); 
    memset(&server, 0, sizeof server); 
    server.sin_addr.s_addr = inet_addr("74.125.224.72"); 
    server.sin_family = AF_INET; 
    server.sin_port = htons(80); 

    //Connect to remote server 
    if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0) 
    { 
     printf("Connect error:%d.\nPress a key to exit...", WSAGetLastError()); 
     closesocket(s); 
     WSACleanup(); 
     c = getch(); 
     return 1; 
    } 
    puts("Connected.\nPress a key to exit..."); 
    closesocket(s); 
    WSACleanup(); 
    c = getch(); 
    return 0; 
} 

Теперь, если вы хотите увидеть код на самом деле подключения я предложил бы использовать localhost (127.0.0.1) вместо 74.125.224.72, и порт 3389, например (это Remote Desktop Server (RDP) порт, если у вас есть RDP, настроенный и запущенный на вашем компьютере) вместо 80; или вы можете позволить 80, если у вас есть веб-сервер (IIS?), запущенный на вашем компьютере.

Чтобы получить список серверных программ, которые работают на вашем компьютере, выполните команду:

`netstat -an | findstr LISTEN` 

, который будет выводить кучу строк (и те, что мы заботимся о ARE) в этой форме (вот один соответствующий RDP примера сверху):

`TCP 127.0.0.1:3389   0.0.0.0:0    LISTENING` 
+0

Привет, CristiFati, я попробовал ваш код и изменил IP-адрес на 127.0.0.1 и номер порта до 3389, но он показывает: Программа «[3468] SocketCTest.exe: Native» вышла с кодом 0 (0x0). – rmtracy

+0

После этого я попробовал несколько других адресов и портов из моего списка серверных программ и получил тот же результат. – rmtracy

+0

Я использую интрасеть моей компании, так как вы думаете, что это может вызвать проблему? – rmtracy