gpt4 book ai didi

c# - 每个套接字地址仅使用一种

转载 作者:行者123 更新时间:2023-12-03 12:05:27 25 4
gpt4 key购买 nike

这是我第一次使用Windows窗体应用程序执行套接字服务器/客户端。

我在Socket.bind(IPEndpoint)下的public void Listen()遇到了问题。我得到了错误

Only one usage of each socket address (protocol/network address/port) is normally permitted



有什么想法可以解决这个问题吗?
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);
}
}
}

最佳答案

如果套接字已经在您的应用程序中的任何其他进程中监听相同端口,则可能会发生这种情况。

只需确保没有应用程序可以使用它,并确保您没有运行同一应用程序的多个实例(请使用taskmanager对其进行验证)。

在旁边:

  • 切勿使用CheckForIllegalCrossThreadCalls = false
  • 具有有意义的方法名称。

  • 您的 IP方法将其命名为 IP毫无意义。我宁愿将其命名为 GetIPAndCreateSocket或类似的名称。

    方法名称应告诉我们该方法将要执行的操作。

    关于c# - 每个套接字地址仅使用一种,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20303052/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com