2012-07-02 2 views
1

um, первое сообщение здесь, это место, кажется, повсюду в google, и я могу обычным образом найти свое решение с необходимостью задать себе вопрос самостоятельно на любом сайте/форумах; но если я потею больше пуль над этим ima охотятся на тех, кто развил winsock и стреляет в них (извините за гнев Я думаю, что явер перевернул каждый камень в каждом корнере сети, не повезло .... breeaatheee .... wheew)C++ winsock дает ошибку 10038 на bind()

Я новый для сетевого программирования, но работал с C++ в течение последних трех лет на уровне хобби, а также недавно играл с AS3.

Im пытается написать сервер (для клиента с проектом AS3 im, также работающим), и насколько я могу сказать, что SOCKET это прекрасно. им не воссоздавать его, многопоточность с ним, пересоздание или что-то еще. нет смешной небрежности. просто пытаясь установить все и привязать(), выплескивает этот скверный 10038 прямо на моем лице.

Ive посмотрел на MSDN, и я очень хорошо знаю, что 10038 означает «попытка операции с недопустимым сокетом»; для жизни меня я не вижу, где ее инвалид.

но достаточно моего бессвязных, Heres код: (functions.h пуст, havnt получил, что далеко вперед пока)

//Server for Project7 - Client written in AS3 under FlashDevelop. Developed under and for the Windows Operating System Enviroment 
//All connections handled under TCP/IP on port 3011 
//Client is URL locked to www.cutdev.com 
//Copyright Tyler Buchinski 2012 All Rights Reserved 
#include <iostream> 
#include "functions.h" 

#define WIN32_MEAN_AND_LEAN 

#include <winsock2.h> 
#include <windows.h> 


     using namespace std; 

int main() 
{ 

    const int iReqWinsockVer = 2; // Minimum winsock version required 

WSADATA wsaData; 

    if (WSAStartup(MAKEWORD(iReqWinsockVer,0), &wsaData)==0) 
    { 
    // Check if major version is at least iReqWinsockVer 
    if (LOBYTE(wsaData.wVersion) >= iReqWinsockVer) 
    { 

     SOCKET SocketListen; 
     SocketListen = (AF_INET,SOCK_STREAM,IPPROTO_TCP); 


      if(SocketListen == INVALID_SOCKET) 
       { 
        cout << "ERROR - could not creaate listening socket." << endl; 
        system("pause"); 

        return 4; 
       } 

      sockaddr_in Listener, Channel1; 

      Listener.sin_family = AF_INET; 
      Listener.sin_port = htons(3011); 
      Listener.sin_addr.S_un.S_addr = INADDR_ANY; 

      int err = bind(SocketListen,(sockaddr*)(&Listener),sizeof(Listener)); 
      if (!err == 0) 
       { 
        cout << "Listener binding failed!" << endl; 
        cout << err << endl; 
        cout << WSAGetLastError(); 

        return 3; 
       } 



    } 
    else 
    { 
     // Required version not available 
     cout <<"Required version of Winsock not installed." << endl; 
    } 

    // Cleanup winsock 
    if (!WSACleanup() == 0) 
    { 
     // cleanup failed 
     cout << "WSACleanup Failed!!" << endl; 
     system("pause"); 
    } 
    } 
    else 
    { 
    cout << "WSA Startup failed!" << endl; 
    } 
    return 0; 
} 

Заранее спасибо за любую помощь! Тайлер

+0

Я не вижу звонок, который в гнезде .... –

ответ

2

Ошибка 10038 является WSAENOTSOCK:

операция была сделана попытка на то, что не является сокет.

Эта ошибка возвращается, если дескриптор в параметре s не является сокетом.

Это происходит, так как вы опустили вызов socket() и SocketListen содержит значение IPPROTO_TCP постоянная вместо дескриптора сокета:

SocketListen = (AF_INET,SOCK_STREAM,IPPROTO_TCP); 

должен стать:

SocketListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
+0

хорошо святое дерьмо! я предполагаю, что это может быть более неприятным, чем это ... не могу поверить, что все время меня играли в лицо (сражались с ним около 4 часов LOL) благодаря буху, теперь, как я могу дать вашему азеру «проголосовать» «? lol (по-прежнему находится на этом месте) – tylerfb11

+0

Хе-хе, вам нужна репутация 15 или более, чтобы иметь возможность проголосовать. Просто принимайте активное участие, и ваша репутация будет расти. –