1

ええと、ここに最初の投稿です。この場所はグーグルのいたるところにあるようで、通常、どのサイト/フォーラムでも自分自身に質問をしなければならないという解決策を見つけることができます。しかし、これ以上弾丸を発汗させたら、Winsockを開発した人を追い詰めて撃ちます(怒ってすみません、ネットの隅々にあるすべての岩を運がなかったと思います.... breeaatheee.... wheew)

ネットワーク プログラミングは初めてですが、過去 3 年間趣味レベルで 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

エラー: 10038_WSAENOTSOCK

ソケットではないものに対して操作が試行されました。

このエラーは、s パラメータの記述子がソケットでない場合に返されます。

これは、呼び出しを省略し、ソケット記述子の代わりに定数の値を含むためsocket()に発生します。SocketListenIPPROTO_TCP

SocketListen = (AF_INET,SOCK_STREAM,IPPROTO_TCP);

なる必要があります:

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