TCP-сервер в C # - PullRequest
       45

TCP-сервер в C #

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

Я просто начинающий программист на сокетах. Я попробовал простой код из PDF-книги "Сокеты TCP / IP в C # Практическое руководство для программистов", но он не работает. Я скомпилировал его в Visual Studio 2010. Пожалуйста, помогите мне, что неправильно и вот полный код

using System; // For Console, Int32, ArgumentException, Environment
using System.Net; // For IPAddress
using System.Net.Sockets; // For TcpListener, TcpClient

class TcpEchoServer {

private const int BUFSIZE = 32; // Size of receive buffer

static void Main(string[] args) {

if (args.Length > 1) // Test for correct # of args
throw new ArgumentException("Parameters: [<Port>]");

int servPort = (args.Length == 1) ? Int32.Parse(args[0]): 7;

TcpListener listener = null;

try {
    // Create a TCPListener to accept client connections
listener = new TcpListener(IPAddress.Any, servPort);
listener.Start();
} catch (SocketException se) {

Console.WriteLine(se.ErrorCode + ": " + se.Message);
Environment.Exit(se.ErrorCode);
}

byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer
int bytesRcvd; // Received byte count
for (;;) { // Run forever, accepting and servicing connections
TcpClient client = null;
NetworkStream netStream = null;

 try {
 client = listener.AcceptTcpClient(); // Get client connection
 netStream = client.GetStream();
 Console.Write("Handling client - ");

 // Receive until client closes connection, indicated by 0 return value
 int totalBytesEchoed = 0;
 while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) {
 netStream.Write(rcvBuffer, 0, bytesRcvd);
 totalBytesEchoed += bytesRcvd;
 }
 Console.WriteLine("echoed {0} bytes.", totalBytesEchoed);

 // Close the stream and socket. We are done with this client!
 netStream.Close();
 client.Close();

 } catch (Exception e) {
 Console.WriteLine(e.Message);
 netStream.Close();
 }
 }
 }
 }

Из комментария:

У меня есть программа для клиента, которая также может подключиться к этой серверной программе. Актуальная проблема в том, что эта серверная программа не запускается. В строке 16-22 есть код try

{ // Create a TCPListener to accept client connections
  listener = new TcpListener(IPAddress.Any, servPort);
  listener.Start();
} 
catch (SocketException se) 
{
  Console.WriteLine(se.ErrorCode + ": " + se.Message);
  Environment.Exit(se.ErrorCode);
}

и программа показывает код ошибки и отображает сообщение, подобное этому

10048: обычно допускается только одно использование каждого адреса сокета

и закрытие программы. Что делать?

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Порт, который вы указываете в new TcpListener(IPAddress.Any, servPort);, кажется, используется, что недопустимо (только одна программа может прослушивать определенный порт).

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

Попробуйте выбрать другой номер порта (например, 10000).Я бы избегал меньших номеров портов (особенно ниже 1024), поскольку они используются хорошо известными программами (веб-серверами, почтовыми серверами и т. Д. - см. на этой странице википедии для получения дополнительной информации)

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

Если вы использовали Visual Studio 2010 для компиляции и запуска этого (через Debug), вы должны установить аргументы командной строки, как того требует ваш код.

Если вы уже запустили программу с аргументами командной строкилибо через консоль, либо установив их в VS), затем, пожалуйста, дайте более подробное объяснение того, почему это не работает.

Чтобы настроить аргументы командной строки, щелкните правой кнопкой мыши ваш проект в Solution Explorer ->Свойства, затем на вкладке «Отладка» введите значение, представляющее порт, в поле «Аргументы командной строки».Без пробелов, только одно значение.

...