0

マルチスレッド技術を使用してサーバーを作成しています。

アイデアは次のとおりです。

-クライアントの接続時にソケット (m_Server) を使用して受け入れます。-受け入れた後、別のポート (t_Socket[i]) を使用してそのクライアントと通信します。そのように簡単です。しかし、ここまでたどり着くまでに約1週間かかりました(ソケットについて少し知識があり、マルチスレッドについては何も知らなかったからです)。

サーバー上の私のコードは次のとおりです。

#include "stdafx.h"
#include "testServer.h"
#include "afxsock.h"
#include "conio.h"
#include "Player.h"
#include <stdio.h>
#include "../functions.h"
#include <iostream>
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define MAX_THREADS 1 
CSocket *p_Socket=new CSocket[MAX_THREADS];

CWinApp theApp;
int count=0;

DWORD WINAPI MyThreadFunction(LPVOID lpParam)
{   
    int i=count;
    cout<<"Send : ";
    m_Send(p_Socket[i]);

    return 1;
}

int m_Send(CSocket &m_Socket)
{

    char Msg[100];
    int MsgSize;
    cin.getline(Msg,100);
    MsgSize=strlen(Msg);
    m_Socket.Send(&MsgSize,sizeof(int));
    m_Socket.Send(Msg,MsgSize);

    return MsgSize;
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(NULL);

    if (hModule != NULL)
    {

        if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
        {
            _tprintf(_T("Fatal Error: MFC initialization failed\n"));
            nRetCode = 1;
        }
        else
        {

            if(AfxSocketInit()==false)
            {
                cout<<"Initialize Library Failed"<<endl;
                return false;
            }

            int playerIndex=0;

                    CSocket m_Server;
            HANDLE hThreadArray[MAX_THREADS];
            DWORD dwThreadIdArray[MAX_THREADS];

            if(m_Server.Create(5770)==0) 
            {
                cout<<"Can not create Socket"<<endl;
                cout<<m_Server.GetLastError();
            }
            else
            {
                cout<<"Successfully initialize server"<<endl;
            }

            m_Server.Listen(5);

            for(int i=0;i<MAX_THREADS;i++)
            {
                if(m_Server.Accept(p_Socket[i]))
                {
                    cout<<"Player "<<i+1<<" connected!"<<endl;
                }
            }
            for(int i=0;i<MAX_THREADS;i++)
            {
                hThreadArray[i]=CreateThread(
                    NULL,                   
                    0,                      
                    MyThreadFunction,       
                    NULL,                   
                    0,                      
                    dwThreadIdArray);   
                //m_Send(p_Socket[i]); (1)
                count++;
            }
            WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);


            for(int i=0;i<MAX_THREADS;i++)
            {
                p_Socket[i].Close();
            }
            m_Server.Close();
            cout<<"Close all connections"<<endl;
            getch();
        }
    }
    else
    {
        _tprintf(_T("Fatal Error: GetModuleHandle failed\n"));
        nRetCode = 1;
    }
    return nRetCode;
}

問題は :

-m_Server が接続を受け入れた後。マルチスレッド関数の p_Socket が正しい接続を受け取りません。

-しかし、番号 (1) でコメントを書いている行を見てください: //m_Send(p_Socket[i]); (1)。CreateThread 行の代わりにその行を実行すると、プログラムはうまく機能します。しかし、それは私のプログラムをシングルスレッドにします。

ところで、コードを最も単純なケースでテストしたいので、MAX_THREADS を 1 に設定しました。私のコードの問題は、 p_Socket[i] がマルチスレッド関数に渡せないことだと思います。

これに関する解決策を2日近く探しています。そこで、誰かが見てくれることを期待して、ここに質問を投稿することにしました。

私の質問を読んでくれてありがとう。私の下手な英語でごめんなさい。

4

1 に答える 1