Winsock C TCP Socket - PullRequest
       30

Winsock C TCP Socket

4 голосов
/ 20 декабря 2011

Я работал с TCP-сокетами раньше в Python.Это выглядит довольно похоже на C, но я не могу заставить что-либо работать.socket(AF_INET, SOCK_STREAM, 0); возвращает -1, что, конечно, указывает на ошибку.Как я мог так быстро пойти не так?Если бы вы могли помочь мне с этой проблемой, это было бы неплохо, но было бы невероятно полезно, если бы вы могли предоставить мне простой, простой исходный код.Он даже не должен ничего делать на самом деле, и он не должен обрабатывать ошибки.Мне просто нужно посмотреть, как правильно создать серверный сокет, связать его, прослушать и принять клиентов, а также как создать и подключить клиентский сокет.Я могу самостоятельно разобраться со всеми прибамбасами.

Спасибо!

Ответы [ 4 ]

9 голосов
/ 20 декабря 2011

Вы звонили WSAStartup, прежде чем делать какие-либо другие вызовы winsock?

8 голосов
/ 20 декабря 2011

Вам необходимо инициализировать WinSock с помощью функции WSAStartup, прежде чем вы сможете использовать сокеты. Реализация Python для сокетов в Windows, вероятно, вызывает это автоматически, поэтому вам не нужно об этом беспокоиться, однако при непосредственном использовании WinSock важно вызывать WSAStartup перед любыми другими вызовами WinSock, а когда ваша программа выполняется с сокетами, вы нужно позвонить WSACleanup.

WSAData data;

if (WSAStartup(MAKEWORD(2, 2), &data) != 0)
{
    // unable to initialise WinSock, time to quit
}

// WinSock has been successfully initialised, time to make sockets!
int s = socket(...);

// After all WinSock stuff is done, balance out your WSAStartup with a cleanup:
WSACleanup();
3 голосов
0 голосов
/ 20 декабря 2011

Возможно, просто у процесса нет разрешения на создание сокетов (errno == EACCES).

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

В любом случае, лучше, чем потом сожалеть, так что положите что-то вроде:

sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
        perror("myapp");
        exit(1);
}

IDK, если Winsock на самом деле устанавливает errno, но он должен ...

...