Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)

Картежник
Дата: 24.10.2014 20:36:42
Вопрос1 подскажите как организовать передачу сообщений между ними. на клиенте есть события Update(при отрисовке) и OnGUI(при действиях пользователя я так понял). При Update должен получать сообщения от сервера и корректировать обстановку, а при OnGUI отправлять сообщения серверу о действиях клиента(новые координаты).
Вопрос2 не будет ли корректировка обстановки опять вызывать Update() при которой опять будет происходить корректировка обстановки и т.д.
Вопрос3 правильно ли организован сервер?
int main(void)
{
    WORD sockVer;
    WSADATA wsaData;
    long int retVal;
 
    sockVer = MAKEWORD(2,2);
 
    WSAStartup(sockVer, &wsaData);
 
    //??????? ?????
    SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(servSock == INVALID_SOCKET)
    {
        printf("Unable to create socket\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
	SOCKADDR_IN sin;
    sin.sin_family = PF_INET;
    sin.sin_port = htons(90);
    sin.sin_addr.s_addr = INADDR_ANY;
    SOCKET clientSock;
 

    retVal = bind(servSock, (LPSOCKADDR)&sin, sizeof(sin));
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to bind\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    //???????? ?????? ??????? ?????
    retVal = listen(servSock, 10);
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to listen\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
    //???? ???????
 clientSock = accept(servSock, NULL, NULL);
    
    if(clientSock == INVALID_SOCKET)
    {
        printf("Unable to accept\n");
        WSACleanup();
        return SOCKET_ERROR;
    }
 
    char szReq[1024]; 
 while(todo){
    retVal = recv(clientSock, szReq, 1024, 0);
.....
s1=myparse(szReq);
.....
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to recv\n");
        return SOCKET_ERROR;
    }
    char *szResp = "Response";
    
  
    

 
    if(retVal == SOCKET_ERROR)
    {
        printf("Unable to send\n");
        return SOCKET_ERROR;
    }

    retVal = send(clientSock, s1.c_str(), s1.length(), 0);
    
    ZeroMemory(szReq,1024);
    
}
    closesocket(clientSock);
    closesocket(servSock);
 
    WSACleanup();
    

    system("PAUSE");
    return EXIT_SUCCESS;


Вопрос4 ну и клиент?
void Awake(){
		ip = "127.0.0.1";
		//ip = "37.151.21.7";
		port = 90;
		s = "";
		ss = "";
		localEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);
		// Create a TCP/IP socket.
		client1 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
		try{
			client1.Connect (localEndPoint);
			Debug.Log ("Connected");
		}
		catch{
			Debug.Log("Can't connect");		
		}
....
}

void Update () {
		byte[] Buffer;
		string data = "";
		Buffer = Encoding.ASCII.GetBytes(data);
		Array.Clear (Buffer,0, Buffer.Length);
		client1.Receive (Buffer);
		data = Encoding.ASCII.GetString (Buffer);
		//Debug.Log (data);
		s = s + data;
		.....

		if (ss != "") {
				
			myparse (ss);
		}
		
		Array.Clear (Buffer,0, Buffer.Length);
		}

	void OnGUI () {
		byte[] Buffer;
		string data;
		
		
		data = "begin \n";
		Buffer = Encoding.ASCII.GetBytes(data);
		client1.Send (Buffer);
		
		Array.Clear (Buffer,0, Buffer.Length);
		
		data = "player " + Player1.transform.localPosition.x.ToString () + " " +
			Player1.transform.localPosition.y.ToString () + " " +
				Player1.transform.localPosition.z.ToString () + " \n";
		Buffer = Encoding.ASCII.GetBytes(data);
		client1.Send (Buffer);
		

		Array.Clear (Buffer,0, Buffer.Length);	
		data = "the_end \n";
		Buffer = Encoding.ASCII.GetBytes(data);
		client1.Send (Buffer);
		
		Array.Clear (Buffer,0, Buffer.Length);		

	}


Все это работает сек 20-30 и затем останавливается пока не выключу сервер
Картежник
Дата: 24.10.2014 20:46:15
я забыл сказать что работает оно только на сервере.т.е сервер принимает сообщения и обрабатывает их и отправляет назад.а вот на клиенте уже не обрабатываются
MasterZiv
Дата: 25.10.2014 18:55:16
Картежник,


Вопрос1 подскажите как организовать передачу сообщений между ними. на клиенте есть события Update(при отрисовке) и OnGUI(при действиях пользователя я так понял). При Update должен получать сообщения от сервера и корректировать обстановку, а при OnGUI отправлять сообщения серверу о действиях клиента(новые координаты).


По любому из существующих протоколов общения.
Например, по XMPP (сложный).
Или STOMP (очень простой).



Вопрос2 не будет ли корректировка обстановки опять вызывать Update() при которой опять будет происходить корректировка обстановки и т.д.

Это уже другие проблемы.


Вопрос3 правильно ли организован сервер?


Ээээ.. проверим.
MasterZiv
Дата: 25.10.2014 19:01:41
В коде клиента ничего не понял, там полный бред какой-то.
Изопропил
Дата: 25.10.2014 21:12:19
MasterZiv
В коде клиента ничего не понял, там полный бред какой-то.

это просто c#
Картежник
Дата: 25.10.2014 23:36:06
с серверной частью вроде все нормально стало.код переделал.теперь он и получает и отправляет.а вот с клиентом проблемы.я думаю из за того что он пока не получит определенное кол-во байтов ставит в ожидание всю программу(игру)
MasterZiv
Дата: 26.10.2014 00:29:54
Изопропил
MasterZiv
В коде клиента ничего не понял, там полный бред какой-то.

это просто c#


ЭТО я понял.
Это -- единственное, что я понял.
MasterZiv
Дата: 26.10.2014 00:30:57
Картежник
с серверной частью вроде все нормально стало.код переделал.теперь он и получает и отправляет.а вот с клиентом проблемы.я думаю из за того что он пока не получит определенное кол-во байтов ставит в ожидание всю программу(игру)


Ты зря думаешь, что это -- проблема с клиентом.
Картежник
Дата: 26.10.2014 09:40:23
MasterZiv,

если я сделаю непрерывную передачу сообщений и с сервера на клиент и обратно,будет ли это правильно?иначе по другому не получается
MasterZiv
Дата: 26.10.2014 14:42:05
Картежник
MasterZiv,

если я сделаю непрерывную передачу сообщений и с сервера на клиент и обратно,будет ли это правильно?иначе по другому не получается



что это значит? она и так такая должна быть.