1

関数createServerSocket()があります。この関数は、ソケットを作成するために複数のスレッドからアクセスできます。

各スレッドが 3 つの引数、socketIdentifier、 *sockaddr_in* 、および特定のポート番号createrServerSocket()関数に渡して、各スレッドが一意のソケットを持つようにします。

このために、socketIdentifier、 *sockaddr_in* 、および特定のポート番号をポインターとして createrServerSocket() 関数に渡し、作成された socketIdentifier とソケットがスレッド内でアクセス可能でなければなりません。

以下は私のコードスニペットです:

VOID createServerSocket(SOCKADDR_IN *socket, SOCKET *socketIdentifier, int PORT)
{

   //Socket Binding//
   WSADATA wsa; 

   //Initialise winsock//
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {
         exit(EXIT_FAILURE);
      }

   //Create a socket//
   if((*socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      {                 
         MessageBox(NULL,
                    "Socket not Created",
                    "Failure :(",
                    MB_ICONINFORMATION);
         exit(EXIT_FAILURE);
      }
   //Socket Created//

   //Prepare the sockaddr_in structure//
   *socket.sin_family = AF_INET;
   *socket.sin_addr.s_addr = INADDR_ANY;
   *socket.sin_port = htons( PORT );

   //Bind//
   if( bind(socketIdentifier ,(struct sockaddr *)&socket , sizeof(socket)) == SOCKET_ERROR)
      {             
         MessageBox(NULL,
                    "Bind Failed",
                    "Failure :(",
                    MB_ICONINFORMATION);
         exit(EXIT_FAILURE);
      }
   //Else Bind Done//
   MessageBox(NULL,
              "Bind Done",
              "SUCCESS :)",
              MB_ICONINFORMATION);

}

呼び出し関数は次のとおりです。

DWORD WINAPI threadProc(LPVOID param)
{
    SOCKADDR_IN socket;
    SOCKET socketIdentifier;
    createServerSocket(*socket,*socketIdentifier,8888); //Create a socket with a socketIdentifier and bind()ed to PORT#8888.
        //Do something at this socket
        Return TRUE;
}

これらは私が得るエラーです:

エラー C2064: 項は 3 つの引数を取る関数として評価されません
エラー C2228: '.sin_family' の左側にはクラス/構造体/共用体が必要です エラー C2228: '.sin_addr' の左側にはクラス/構造体/共用体が必要です
エラー C2228: 左側'.S_un' にはクラス/構造体/共用体
エラー C2228 が必要です: '.S_addr' の左側にはクラス/構造体/共用体エラーが必要です C2228: '.sin_port' の左側にはクラス/構造体/共用体
エラーが必要です C2070: ''unknown- type'': オペランドのサイズが不正です

行: if((*socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)

エラー: エラー C2064: 項は 3 つの引数を取る関数として評価されません

4

2 に答える 2

1

関数 createServerSocket で問題とコンパイラ エラーを引き起こしている socket という名前の変数があります。次のようなことを試してください:

VOID createServerSocket(SOCKADDR_IN& sock, SOCKET& socketIdentifier, int PORT)
{

   //Socket Binding//
   WSADATA wsa; 

   //Initialise winsock//
   if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
      {
         exit(EXIT_FAILURE);
      }

   //Create a socket//
   if((socketIdentifier = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
      {                 
         MessageBox(NULL,
                    "Socket not Created",
                    "Failure :(",
                    MB_ICONINFORMATION);
         exit(EXIT_FAILURE);
      }
   //Socket Created//

   //Prepare the sockaddr_in structure//
   sock.sin_family = AF_INET;
   sock.sin_addr.s_addr = INADDR_ANY;
   sock.sin_port = htons( PORT );

}

DWORD WINAPI threadProc(LPVOID param)
{
    SOCKADDR_IN sock;
    SOCKET socketIdentifier;
    createServerSocket(sock,socketIdentifier,8888); //Create a socket with a socketIdentifier and bind()ed to PORT#8888.
        //Do something at this socket
        return TRUE;
}
于 2013-05-03T05:44:03.203 に答える
1

あなたのbind呼び出しは完全に間違っています。次のようになります。

bind(*socketIdentifier, (SOCKADDR*) socket, sizeof(*socket))

socketまた、構造体ポインターの初期化の優先順位にも問題があり、コンパイラ エラーが発生します。(*socket).sin_familyetc を使用するか、 etc を使用します。socket->sin_family最後の 1 つは、構造体ポインターの一般的な使用法です。

于 2013-05-03T05:34:08.120 に答える