• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Сокеты

  • Автор темы iosif88
  • Дата начала
I

iosif88

Итак, стоит следующая задача есть сервер который должен принимать строки от клиента, обрабатывать их и возвращать ему. Вопрос как правильно организовать это взаимодействие чтоб это было надежно. Скажем есть такой код:

Сервер:

Код:
			listener = new TcpListener(9050);
listener.Start();
Socket socket = null;
while (true)
{
try
{
listener.Start();
socket = listener.AcceptSocket();
string answer = "";
int brec = socket.Receive(buffer);

string msg = Encoding.ASCII.GetString(buffer, 0, brec);

if (msg != "")
{
answer = OFSReq(msg); //здесь строка обрабатывается 
}
else
{
answer = "Wrong String"; 
}

byte[] answ = Encoding.ASCII.GetBytes(answer);
socket.Send(answ);
}
catch (Exception Exp)
{
/*byte[] answ = Encoding.ASCII.GetBytes(Exp.Message);
socket.Send(answ);*/
WriteExpLog(Exp.Message);

}
finally
{
socket.Close();
}

Клиент

Код:
		  IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
try {
server.Connect(IPAddress.Parse("127.0.0.1"), 9050);

byte[] buffer = new Byte[1024];
string message = textBox1.Text;
buffer = Encoding.ASCII.GetBytes(message);
byte[] answer = new Byte[1024];
server.Send(buffer);
int received = server.Receive(answer);
if (received < 0 )
{
richTextBox1.AppendText("Read failed \n");
server.Close();
return;
}
richTextBox1.AppendText(Encoding.ASCII.GetString(answer, 0, answer.Length) + "\n");


}
catch (Exception exp) 
{
richTextBox1.AppendText(exp.Message + "\n");
}
finally 
{
server.Close();
}

Проблема в данном случае что при потпытке послать пустую строку всё "замораживается".

Это лишь пример, а в общем хотелось бы понять как нужно правильно организовать это взаимодействие, чтоб всё работало надежно, не зависимо от того что происходит на стороне клиента. Какой должен быть общий алгоритм сервера? Где и какие исключения нужно обратывать? Нужно ли при слишком долгом ожидании клиента отключать его от сервера и как это сделать (чтоб сервер заново мог принимать сообщения)?

Думаю тема была бы полезна не только мне. Если у вас есть ссылка на подобно рода материалы поделитесь.
 
Y

Young Programmer

для взаимодействия клиент-сервер посоветовал бы использовать WCF. Простых примеров передачи строк в интернете хватает, не нужно заморачиваться с сокетами всякими.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!