powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
25 сообщений из 47, страница 1 из 2
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38787029
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос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
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38787035
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я забыл сказать что работает оно только на сервере.т.е сервер принимает сообщения и обрабатывает их и отправляет назад.а вот на клиенте уже не обрабатываются
...
Рейтинг: 0 / 0
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38787292
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежник,


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


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



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

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


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


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

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

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

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

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


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

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

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



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

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

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

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


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

Я знаю, я просто хотел ещё раз это подчеркнуть. Для НЕГО.
...
Рейтинг: 0 / 0
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38790082
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на клиенте формируется сообщение разной длиной, может быть и меньше 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
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38790093
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на сервере вывел
Код: 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
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38790098
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опечатку сделал,просто у себя пишу строчными, а здесь прописными решил написать
Код: plaintext
1.
cout<<sizeof(msg)<<"  "<S.length()<<"\n";
...
Рейтинг: 0 / 0
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38790107
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[Картежник]на клиенте формируется сообщение разной длиной, может быть и меньше 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
Взаимодействие между сервером на c++ и клиентом на c#(Unity3d)
    #38790114
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Картежникопечатку сделал,просто у себя пишу строчными, а здесь прописными решил написать
Код: plaintext
1.
cout<<sizeof(msg)<<"  "<S.length()<<"\n";




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

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




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

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



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

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

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



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

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


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