マルチスレッド技術を使用してサーバーを作成しています。
アイデアは次のとおりです。
-クライアントの接続時にソケット (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日近く探しています。そこで、誰かが見てくれることを期待して、ここに質問を投稿することにしました。
私の質問を読んでくれてありがとう。私の下手な英語でごめんなさい。