1

嗯,这里的第一篇文章,这个地方似乎到处都是谷歌,我通常可以找到我的解决方案,不得不在任何网站/论坛上亲自问我自己的问题;但是,如果我在这个问题上再发汗,我会追捕开发出winsock并射击他们的人(对不起,我认为我没有运气就翻过网的每个角落的每一块石头...... breeaatheee .... wheew

我是网络编程的新手,但在过去三年里一直在使用 C++,只是出于兴趣,最近也在玩 AS3。

我正在尝试编写一个服务器(对于客户来说,我也在从事 AS3 项目),据我所知,这个 SOCKET 非常好。我没有重新创建它,使用它进行多线程处理,没有重新分配或任何东西。没有有趣的偏见。只是想把它全部设置好,bind() 就在我脸上吐出了讨厌的 10038。

我看过 MSDN,我很清楚 10038 的意思是“尝试对无效套接字进行操作”;对于我的生活,我看不出它在哪里无效。

但是我的闲话已经够多了,下面是代码:(functions.h 是空的,还没有走那么远)

 //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;
}

提前感谢您的帮助!-泰勒

4

1 回答 1

3

错误10038WSAENOTSOCK

尝试对不是套接字的东西进行操作。

如果 s 参数中的描述符不是套接字,则返回此错误。

发生这种情况是因为您省略了对常量的调用socket()SocketListen包含IPPROTO_TCP常量的值而不是套接字描述符:

SocketListen = (AF_INET,SOCK_STREAM,IPPROTO_TCP);

应该变成:

SocketListen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
于 2012-07-02T08:41:10.360 回答