2013-11-30 3 views
0

Это первый раз, когда я использовал приложение Windows Form для работы сокета-сервера/клиента.Только одно использование адреса каждого сокета

У меня возникла проблема с моим Socket.bind(IPEndpoint) под моим public void Listen(). Я получаю ошибку

Только одно использование адреса сокета (протокол/сетевой адрес/порт) обычно разрешается

Любые идеи, как я мог бы идти о фиксации этого?

public Form1() 
{ 
    CheckForIllegalCrossThreadCalls = false; 
    InitializeComponent(); 
} 

Socket sck; 
Socket acc; 
IPEndPoint ipe; 
List<Socket> lstClient = new List<Socket>(); 
Thread handleClient; 
string myIP = ""; 

public void IP() 
{ 
    IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); 
    foreach (IPAddress address in host.AddressList) 
    { 
     if (address.AddressFamily.ToString() == "InterNetwork") 
     { 
      myIP = address.ToString(); 
     } 
    } 
    ipe = new IPEndPoint(IPAddress.Parse(myIP), 2001); 
    sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, 
     ProtocolType.IP); 
} 

private void btnListen_Click(object sender, EventArgs e) 
{ 
    this.Form1_Load(sender, e);  
} 

private void rtbMain_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    e.Handled = true; 
} 

private void Form1_Load(object sender, EventArgs e) 
{ 
    IP(); 
    handleClient = new Thread(new ThreadStart(Listen)); 
    handleClient.IsBackground = true; 
    handleClient.Start(); 
} 
public void Listen() 
{ 
    sck.Bind(ipe); 
    sck.Listen(3); 
    while(true) 
    { 
     Socket acc=sck.Accept(); 
     lstClient.Add(acc); 

     Thread clientProcess = new Thread(myThreadClient); 
     clientProcess.IsBackground = true; 
     clientProcess.Start(acc); 

     rtbMain.SelectionFont = new Font("Arial", 18, FontStyle.Bold); 
     rtbMain.SelectionColor = Color.Green; 
     rtbMain.AppendText("accept connections from" + 
      acc.RemoteEndPoint.ToString()); 
     rtbMain.ScrollToCaret(); 
    } 
} 

private void myThreadClient(object obj) 
{ 
    Socket clientACC = (Socket)obj; 
    while(true) 
    { 
     byte[] sizeBuf = new byte[1024]; 
     int rec = clientACC.Receive(sizeBuf); 
     foreach (Socket acc in lstClient) 
     { 
      acc.Send(sizeBuf,sizeBuf.Length,SocketFlags.None); 
     } 
    } 
} 
+0

Так вы пытаетесь связать несколько сокетов с тем же протоколом/адресом/портом? – gunr2171

+0

В основном, я хочу, чтобы мой сервер слушал, когда к нему подключается клиент/несколько клиентов, в основном, сервер чата/клиент настроен по IP-адресу, если это имеет смысл? – user3047041

ответ

0

Это может произойти, если сокет уже прослушивает в одном и том же порту приложения какие-либо другие процессы.

Просто убедитесь, что у нас нет приложений, и убедитесь, что вы не запускаете несколько экземпляров одного и того же приложения (проверьте его с помощью taskmanager).


Помимо:

  • Никогда не используйте CheckForIllegalCrossThreadCalls = false
  • Есть значащие имена методов.

Ваш метод IP не имеет смысла называть его IP. Я бы назвал его GetIPAndCreateSocket или что-то в этом роде.

Имя метода должно указывать нам, что этот метод будет делать.

Смежные вопросы