クライアントからファイルを送信できる小さなプログラムを作成しています - >サーバー(送信)およびサーバー - >クライアント(要求)。
この部分はよくできていますが、次の場合に問題が発生します。 1. サーバーでファイルを見つけました。クライアント側で cin を実行するにはどうすればよいですか? 2. サーバーとクライアントの間でメッセージを強制的に同期するにはどうすればよいですか? つまり、サーバーが次のステップに移動したり、受信時にフリーズしたりしたくないということです。例 (この問題ではスレッド化は適用されていません): - サーバー: クライアントからのメッセージを待機しています。クライアント: メッセージを送信します。クライアント: クライアントからのメッセージを待っています。サーバー: メッセージを送信します。.....等。
まれに、メッセージが順番どおりに届くことがありますが、99.999% の確率で届かず、両側のプログラムがフリーズします。
順序付けされていないメッセージの問題は、クライアント側のスレッドが inc 応答を読み続け、実際の関数がそれらを参照できないようにすることでした。
ただし、ポイント1について。私はこのコードで試しています:1.共有リソースがないため、この関数内のすべてを定義しようとしています(問題が発生している部分)2.この関数をスレッドに渡そうとしていたのでサーバーはより多くのクライアントを受け入れることができます。3. 通常の send/recv 呼び出しだけで特別なことは何も送受信しません。3. 質問: SendMyMessage と ReceiveMyMessage が異なるスレッドで使用される場合、メッセージと共にソケットを渡す必要がありますか?
void ExecuteRequest(void * x)
{
RequestInfo * req = (RequestInfo *) x;
// 1st Message Direction get or put
fstream myFile;
myFile.open(req->_fName);
char tmp;
string _MSG= "";
string cFile = "*";
if(req->_fDir.compare("put") == 0)
{
if(myFile.is_open())
{
SendMyMessage("*F*");
cFile = ReceiveMyMessage();
// I want here to ask the client what to do after he found the that file exist on the server,
// I want the client to to get a message "*F*", then a cin command appear to him
// then the client enter a char
// then a message sent back to the server
// then the server continue executing the code
//More code
}
クライアント側:
{
cout <<"Waiting Message" <<endl;
temps = ReceiveMessage();
if(temps.compare("*F*") == 0)
{
cout <<"File found on Server want to:\n(1)Replace it.\n(2)Append to it." <<endl;
cin>>temps;
SendMyMessage(temps);
}}
Visual Studio 2013 Windowx 7 スレッドを使用しています: _beginthread (すべてのスレッドを削除しました)
よろしく、