2013-09-28 2 views
0

Я пишу небольшую программу, которая может отправлять файл с Клиента -> Сервер (Отправить) и Сервер -> Клиент (Запрос).Сервер C++ - Синхронизация сообщений клиента

Хорошо сделанная эта часть, но проблемы возникают, когда: 1. Я нашел файл на сервере, как я могу выполнить cin на стороне клиента? 2. Как заставить синхронизировать сообщения между сервером и клиентом? Я имею в виду, что я не хочу, чтобы сервер перешел к следующему шагу или замерзал при получении. Для примера (Нет резьбы, применяемой в этой значке): - Сервер: ожидание сообщения от клиента. Клиент: Отправить сообщение. Клиент: Ожидание сообщения от клиента. Сервер: Отправить сообщение. ..... и т.п.

В редкие времена сообщения поступают на заказ, но 99,999% времени, когда они этого не делают, и программа с двух сторон замерзает.

Проблема с сообщениями inorder была потоком на стороне клиента, который продолжал читать ответы inc, не позволяя фактическим функциям их видеть.

Однако около точки 1. Я пытаюсь в этом коде: 1. Нет общих ресурсов, так что я пытаюсь определить все внутри этой функции (ее части, где проблема происходит) 2. Я пытался передать эту функцию в поток, чтобы сервер мог принимать больше клиентов. 3. отправить & не получите ничего особенного о них, просто обычные вызовы отправки/получения. 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 (я удалил все темы)

С уважением,

+0

Возможно, вы не видели «Хорошо сделана эта часть, но проблемы приходят». Только те 2 пункта, которые я все еще пытаюсь решить. – nothing

+0

Хорошо, покажите проблемную часть вашего кода. Трудно сказать что-нибудь сейчас. – deepmax

+0

k Спасибо, я добавил часть кода, относящуюся к этой проблеме – nothing

ответ

0

В Linux , есть системный вызов «select», с помощью которого сервер может ждать в открытых сокетах. Как только происходит какое-то действие, как клиент пишет что-то, сервер просыпается на этих сокетах и ​​обрабатывает данные.

Вы находитесь на платформе Windows. Итак: http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141%28v=vs.85%29.aspx

Смежные вопросы