Ошибка Winsock 1013 — Отказано в доступе

Я пытаюсь запустить простую программу ниже, используя C:

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

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

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

    printf("Initialising Winsock...\n");
    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
    {
        printf("Failed. Error Code : %d", WSAGetLastError());
        getchar();
        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());
        getchar();
    }

    printf("Socket created.\n");


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

    //Connect to remote server
    iResult = connect(s, (struct sockaddr *)&server, sizeof (server));
    if (iResult == SOCKET_ERROR)
    {
        printf("Connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(s);
        if (iResult == SOCKET_ERROR)
            printf("closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        getchar();
        return 1;
    }
    printf("Connected");
    getchar();
    return 0;
}

Это в основном программа C, которая создает сокет и устанавливает соединение с Google. (Я просто следую руководству: http://www.binarytides.com/winsock-socket-programming-tutorial, так как я новичок в программировании сокетов).

Теперь моя программа выводит:

Initialising Winsock...
Initialised.
Socket Created.
Connect function failed with error: 10013

После некоторых исследований я обнаружил, что это означает, что это ошибка отказа в разрешении. Я попытался найти некоторые исправления, такие как запуск Visual Studio Express от имени администратора и запуск этих команд в командной строке:

netsh winsock reset catalog
netsh int ip reset reset.log hit

и перезагрузить компьютер, но он все еще не работает.

Стоит упомянуть, что когда я выполнил 2-ю команду: netsh int ip reset reset.log, я получил следующее сообщение об ошибке:

Resetting , failed.
Access is denied.
There's no user specified settings to be reset.

Хотя я запускал командную строку от имени администратора.

Я также временно деактивировал свой Kaspersky Internet Security, но до сих пор не исправился. Я совершенно новичок в программировании на C и сокетах.


person Yahya Uddin    schedule 23.10.2014    source источник
comment
вы должны обнулить структуру сервера sockaddr_in перед ее использованием   -  person 4pie0    schedule 23.10.2014
comment
Извините, я не понимаю, что вы имеете в виду (я новичок в C)? Какой код мне написать?   -  person Yahya Uddin    schedule 23.10.2014
comment
набор памяти (сервер, 0, размер сервера);   -  person 4pie0    schedule 23.10.2014
comment
Я пробовал: memset(&server, 0, sizeof server); перед server.sin_addr.s_addr = inet_addr(74.125.235.20); но это ничего не решает! только сервер дает мне ошибку времени компиляции!   -  person Yahya Uddin    schedule 23.10.2014
comment
Мне очень жаль. Я сказал что-то не то? Почему ты кричишь?   -  person 4pie0    schedule 23.10.2014
comment
Я не кричу лмао. Откуда ты вообще знаешь, кричу я или нет, лол?   -  person Yahya Uddin    schedule 23.10.2014
comment
на основе использования восклицательного знака 0x21. Это служит показателем более высокого объема.   -  person 4pie0    schedule 23.10.2014
comment
Скорее всего, Google не позволяет вам подключиться к своему порту.   -  person awatan    schedule 23.10.2014
comment
Тогда он получил бы сообщение об отказе в подключении, но 10013 — это WSAEACCESS и это распространенные причины   -  person 4pie0    schedule 23.10.2014


Ответы (1)


Я попробовал ваш код и могу использовать его для подключения к другой машине. Я сделал небольшую модификацию, так как сейчас у меня под рукой нет машины с HTTP-сервером. Поэтому я использовал www.google.com:

struct sockaddr_in server;
remoteHost = gethostbyname("www.google.com");   // get IP of www.google.com
server.sin_addr.s_addr = *((unsigned long *)remoteHost->h_addr);  // inet_addr("74.125.235.20");
server.sin_family = AF_INET;
server.sin_port = htons(80);

Вывод вашего приложения:

Initialising Winsock...
Initialised.
Socket created.
Connected

Так что в основном ваша реализация правильная.

Это значит, что рядом какой-то другой гремлин! описание MSDN ошибки 10013 это:

WSAEACCES
10013 (0x271D)
An attempt was made to access a socket in a way forbidden by its access permissions.

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

Если это работает, попробуйте найти настройки брандмауэра/антивируса, которые могут блокировать подключение вашего приложения. Это может быть настоящим испытанием (я знаю, о чем говорю)...

person Lukas Thomsen    schedule 23.10.2014
comment
Спасибо, но, как я уже сказал в вопросе, я уже отключил свой Касперский, но безрезультатно. - person Yahya Uddin; 24.10.2014
comment
Ну, я знаю из личного опыта, что Касперский как бы защищает вас (даже если он выключен)... - person Lukas Thomsen; 24.10.2014
comment
Так как же мне его выключить - person Yahya Uddin; 24.10.2014
comment
ОДНА вещь, которую я бы попробовал, это отключить автоматический запуск после загрузки. Кроме того, вы можете добавить правила, позволяющие вашей программе что-то делать (но, поскольку ваша программа изменяется во время разработки, вам, вероятно, потребуется новое правило после каждой сборки). Последний жестокий способ — удалить его. Кроме того, убедитесь, что брандмауэр Windows отключен. - person Lukas Thomsen; 24.10.2014