2011-12-20 5 views
4

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

Спасибо!

+2

Что возвращает 'WSAGetLastError()' после вызова сокета? – greatwolf

+0

Выполняет ли пользователь программу, имеющую разрешение на использование сети? – cHao

+0

WSAGetLastError возвращает 10093, и я регулярно запускаю программы, написанные на Python, которые используют сокеты. –

ответ

8

Вы должны инициализировать 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(); 
+0

Благодарим за использование WSAStartup. Этот вид программирования C меня смущает ... –

0

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

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

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

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

ИДК, если Winsock фактически устанавливает errno, но он должен ...

+0

Winsock не является частью CRT, поэтому у него не будет доступа к 'errno'. Однако он устанавливает код ошибки, который можно получить с помощью 'WSAGetLastError'. – cHao

+0

Странно, что 'errno' должно быть локально в любом случае ... (но вы всегда можете ожидать чего-то подобного от программного обеспечения Microsoft) –

+0

Итак, есть ли какая-то функция, чтобы перевести его в текстовую строку, читаемую человеком? –

9

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

+0

Он, скорее всего, этого не сделал. +1 – jweyrich

+0

Да ... Это было бы ... –

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