программирование сокетов на C # сервере - PullRequest
0 голосов
/ 28 октября 2011

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

class Program
{
   //static byte[] Buffer { get; set; }
   //static Socket sck;
   static void Main(string[] args)
   {
       while (true)
       {
           Socket sck;
           sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream,      ProtocolType.Tcp);
           sck.Bind(new IPEndPoint(0, 2000));
           sck.Listen(10);
           Socket accepted = sck.Accept();
           byte [] Buffer = new byte[accepted.SendBufferSize];
           int bytesRead = accepted.Receive(Buffer);
           byte[] formatted = new byte[30];
           for (int i = 0; i < 30; i++)
           {
               formatted[i] = Buffer[i];
           }
           string strData = Encoding.ASCII.GetString(formatted);
           Console.Write(strData + "\r\n");
           sck.Close();
           accepted.Close();
       }
   }
}

Ответы [ 3 ]

1 голос
/ 28 октября 2011

Это не то, как вы обычно кодируете сервер. Обычно слушатель не ложится спать и просто принимает новые соединения и закрывает их по окончании. Возможно, что со второй попытки клиент подключается к вашему старому слушателю непосредственно перед тем, как вы его закроете. Попробуйте оставить слушателя открытым или закройте его, как только вы примете соединение.

0 голосов
/ 28 октября 2011

Вам необходимо запустить сервер в Thread

 public void StartListener()
        {

            while (true)
            {
                mySocket = myListener.AcceptSocket();
                Console.WriteLine("\r\nsocket type = {0}", mySocket.SocketType);
                if (mySocket.Connected)
                {
                 byte[] receive = new byte[1024];
                 mySocket.Receive(receive, 1024, 0);
                 string sBuffer = Encoding.ASCII.GetString(receive);
                }
           }
   }

Затем:

        IPAddress IPaddress = Dns.Resolve(Dns.GetHostName()).AddressList[0];
        TcpListener myListener = new TcpListener(IPaddress, 50);
        myListener.Start();
        Thread th = new Thread(new ThreadStart(StartListener));
        th.Start();

Дополнительная информация:

TcpListener Class

Тема

0 голосов
/ 28 октября 2011

Вам нужен TcpListner

http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=vs.71).aspx

Кроме того, для обработки многих запросов вам необходим сервер, обрабатывающий несколько запросов в разных потоках.Вам понадобится пул потоков.Посмотрите на ThreadPool.QueueUserWorkitem.

Вот более полный пример использования C # TCP-сервера:

http://www.codeproject.com/KB/IP/dotnettcp.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...