Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Взаимодействие между сервером на c++ и клиентом на c#(Unity3d) / 25 сообщений из 47, страница 1 из 2
24.10.2014, 20:36
    #38787029
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Вопрос1 подскажите как организовать передачу сообщений между ними. на клиенте есть события Update(при отрисовке) и OnGUI(при действиях пользователя я так понял). При Update должен получать сообщения от сервера и корректировать обстановку, а при OnGUI отправлять сообщения серверу о действиях клиента(новые координаты).
Вопрос2 не будет ли корректировка обстановки опять вызывать Update() при которой опять будет происходить корректировка обстановки и т.д.
Вопрос3 правильно ли организован сервер?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
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 ну и клиент?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
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 и затем останавливается пока не выключу сервер
...
Рейтинг: 0 / 0
24.10.2014, 20:46
    #38787035
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
я забыл сказать что работает оно только на сервере.т.е сервер принимает сообщения и обрабатывает их и отправляет назад.а вот на клиенте уже не обрабатываются
...
Рейтинг: 0 / 0
25.10.2014, 18:55
    #38787292
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Картежник,


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


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



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

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


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


Ээээ.. проверим.
...
Рейтинг: 0 / 0
25.10.2014, 19:01
    #38787295
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
В коде клиента ничего не понял, там полный бред какой-то.
...
Рейтинг: 0 / 0
25.10.2014, 21:12
    #38787334
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
MasterZivВ коде клиента ничего не понял, там полный бред какой-то.
это просто c#
...
Рейтинг: 0 / 0
25.10.2014, 23:36
    #38787400
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
с серверной частью вроде все нормально стало.код переделал.теперь он и получает и отправляет.а вот с клиентом проблемы.я думаю из за того что он пока не получит определенное кол-во байтов ставит в ожидание всю программу(игру)
...
Рейтинг: 0 / 0
26.10.2014, 00:29
    #38787417
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
ИзопропилMasterZivВ коде клиента ничего не понял, там полный бред какой-то.
это просто c#

ЭТО я понял.
Это -- единственное, что я понял.
...
Рейтинг: 0 / 0
26.10.2014, 00:30
    #38787418
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Картежникс серверной частью вроде все нормально стало.код переделал.теперь он и получает и отправляет.а вот с клиентом проблемы.я думаю из за того что он пока не получит определенное кол-во байтов ставит в ожидание всю программу(игру)

Ты зря думаешь, что это -- проблема с клиентом.
...
Рейтинг: 0 / 0
26.10.2014, 09:40
    #38787475
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
MasterZiv,

если я сделаю непрерывную передачу сообщений и с сервера на клиент и обратно,будет ли это правильно?иначе по другому не получается
...
Рейтинг: 0 / 0
26.10.2014, 14:42
    #38787576
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
КартежникMasterZiv,

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


что это значит? она и так такая должна быть.
...
Рейтинг: 0 / 0
27.10.2014, 20:43
    #38788632
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
MasterZiv,

а разве сервер не ждет при len=recv(clients[number].Sock,msg1,sizeof(msg1),0);
и я сделал по два потока для каждого на сервере один для приема другой для отправки,тот который для отпраквки отправляет беспрерывно,а тот который для приема ждет пока не поступит сообщение.
...
Рейтинг: 0 / 0
27.10.2014, 21:39
    #38788659
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Картежника разве сервер не ждет при len=recv(clients[number].Sock,msg1,sizeof(msg1),0);
сокет может вернуть меньше чем sizeof(msg1)

самому "сообщение" собирать нужно - или на разделителях основываясь, или по длине, прямо или косвенно переданной в заголовке
...
Рейтинг: 0 / 0
28.10.2014, 10:07
    #38788946
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Картежника разве сервер не ждет при len=recv(clients[number].Sock,msg1,sizeof(msg1),0);



Если данных нет -- ждёт. Есть -- не ждёт.

Картежники я сделал по два потока для каждого на сервере один для приема другой для отправки,тот который для отпраквки отправляет беспрерывно,а тот который для приема ждет пока не поступит сообщение.

Как-то я этого не видел... Ну хорошо, если так.
...
Рейтинг: 0 / 0
28.10.2014, 10:08
    #38788950
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
ИзопропилКартежника разве сервер не ждет при len=recv(clients[number].Sock,msg1,sizeof(msg1),0);
сокет может вернуть меньше чем sizeof(msg1)

самому "сообщение" собирать нужно - или на разделителях основываясь, или по длине, прямо или косвенно переданной в заголовке


Ребята, я хочу заметить ещё раз, что никаких "сообщений" в TCP нет.
...
Рейтинг: 0 / 0
28.10.2014, 10:28
    #38788977
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
MasterZivРебята, я хочу заметить ещё раз, что никаких "сообщений" в TCP нет.
если ты внимательно читал мой пост - речь идёт о сообщениях прикладного уровня(поверх tcp)
а топикстартер с этой задачей бьётся уже давно
...
Рейтинг: 0 / 0
28.10.2014, 10:36
    #38788992
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Изопропил,

Я знаю, я просто хотел ещё раз это подчеркнуть. Для НЕГО.
...
Рейтинг: 0 / 0
29.10.2014, 06:20
    #38790082
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
на клиенте формируется сообщение разной длиной, может быть и меньше 256(оно ограничено словами begin и the_end,между этими словами тело сообщения), и больше,затем с клиента делаю отправку на сервер по 256 байт, не достающие байты последнего соощения заполняю пробелами.

на сервере все собирается в переменную S до тех пор пока не соберется полностью сообщение (пока не будет begin и the_end).
Код: plaintext
1.
2.
3.
4.
msg[256]
...//тут чтение в msg
S=S+msg;
...



вот каждый раз когда приходит 256 байтов и я их добавляю к S то между ними добавляется еще какие то символы непонятные,они уже идут в msg,забыл,то ли вначале,то ли в конце. и на клиенте и на сервере количество символов 256
...
Рейтинг: 0 / 0
29.10.2014, 07:18
    #38790093
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
на сервере вывел
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
string S="";
...
while(b){
  msg[256];
  ...
  S=S+msg;
  cout<<sizeof(msg)<<"  "<s.length()<<"\n";
}


Для первого приема 256 байтов вывело следующее
Код: plaintext
1.
256 276


потом посчитал количество букв(не цифр) в msg = 20(то строке 236 байтов под цифры,и 20*2=40 байтов для букв) выходит что при при добавлении в строку оно все перекодируется в другую кодировку(кол-во байтов меняется),и не могу понять связано это как то с тем что у меня появляются лишние символы(непонятные типа ММММхММХФМММММ,это в отладчике так показывает,а в консоле специфические символы,которых нет на клаве)
...
Рейтинг: 0 / 0
29.10.2014, 07:30
    #38790098
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
опечатку сделал,просто у себя пишу строчными, а здесь прописными решил написать
Код: plaintext
1.
cout<<sizeof(msg)<<"  "<S.length()<<"\n";
...
Рейтинг: 0 / 0
29.10.2014, 08:00
    #38790107
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
[Картежник]на клиенте формируется сообщение разной длиной, может быть и меньше 256(оно ограничено словами begin и the_end,между этими словами тело сообщения), и больше,затем с клиента делаю отправку на сервер по 256 байт, не достающие байты последнего соощения заполняю пробелами.




а зачем? для пущей лучшести?




на сервере все собирается в переменную S до тех пор пока не соберется полностью сообщение (пока не будет begin и the_end).


Код: plaintext
1.
2.
3.
4.
msg[256]
...//тут чтение в msg
S=S+msg;
...



вот каждый раз когда приходит 256 байтов и я их добавляю к S то между ними добавляется еще какие то символы непонятные,они уже идут в msg,забыл,то ли вначале,то ли в конце. и на клиенте и на сервере количество символов 256[/quot]


ой я устал уже...
...
Рейтинг: 0 / 0
29.10.2014, 08:08
    #38790114
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Картежникопечатку сделал,просто у себя пишу строчными, а здесь прописными решил написать
Код: plaintext
1.
cout<<sizeof(msg)<<"  "<S.length()<<"\n";




Тебе по-видимому нужно писать на каком- то другом языке программирования, С для тебя не подходит.

Ну или хотя бы для начала язык подучить, ты основ не знаешь, ты сетевой сервер так не напишешь на шару, не получится.
...
Рейтинг: 0 / 0
29.10.2014, 08:32
    #38790136
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
MasterZivКартежникопечатку сделал,просто у себя пишу строчными, а здесь прописными решил написать
Код: plaintext
1.
cout<<sizeof(msg)<<"  "<S.length()<<"\n";




Тебе по-видимому нужно писать на каком- то другом языке программирования, С для тебя не подходит.

Ну или хотя бы для начала язык подучить, ты основ не знаешь, ты сетевой сервер так не напишешь на шару, не получится.
Ты прав я пришел из Дельфи.
но как так определил по одной этой строчке что ли?а где там ошибка?
...
Рейтинг: 0 / 0
29.10.2014, 09:29
    #38790196
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
КартежникMasterZivпропущено...



Тебе по-видимому нужно писать на каком- то другом языке программирования, С для тебя не подходит.

Ну или хотя бы для начала язык подучить, ты основ не знаешь, ты сетевой сервер так не напишешь на шару, не получится.
Ты прав я пришел из Дельфи.
но как так определил по одной этой строчке что ли?а где там ошибка?

Код: plaintext
1.
cout<<sizeof(msg)



Тут ты печатаешь константу.
...
Рейтинг: 0 / 0
29.10.2014, 09:37
    #38790216
Картежник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
MasterZiv,
что там константа 256 это я знаю.можно было и не выводить sizeof(msg).но вопрос о другом.почему добавляются дополнительные непонятные символы,это утечка в памяти?Каждый раз после запуска программы, при первом приеме всего сообщения, всегда в одном и том же месте одни и те же непонятные символы в одном и том же кол-ве. После второго приема всего сообщения(т.е. begin и the_end) идет смещение,добавляются новые непонятные символы,но все в том же месте
...
Рейтинг: 0 / 0
29.10.2014, 09:42
    #38790231
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
Картежник,

в msg нет завершающего нуля - вот мусор при конкатенации и приклеивается (до первого нулевого символа)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Взаимодействие между сервером на c++ и клиентом на c#(Unity3d) / 25 сообщений из 47, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]