砂糖~砂糖~ 2022-11-16 23:03 采纳率: 50%
浏览 9
已结题

C#socket无法分配端口问题

w我在linux上运行完全没有问题的.netSocket连接程序,始终是无法分配连接Cannot assign requested address
但是在一台1h0.5g的超垃圾服务器上竟然运行成功了,我把我的服务器重装系统,保证除了.NET的sdk下没有运行其他任何程序(宝塔都没下),但依然错误。
网上搜索的结果几乎都是说要释放端口,可我的端口已经空得不能再空了。
我枚举从32767端口试到60000,没一个成功(安全组确认已开放)
请问下需要怎么做?

服务端配置:centos7.8,.net6.0
程序配置:':Visual Studio C# 控制台,.netSocket

服务端代码:

Console.WriteLine("[服务器]启动");
IPAddress ip = IPAddress.Parse("我写得服务器外网地址");
IPEndPoint point = new IPEndPoint(ip, int.Parse(32790));
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
try
{
    socket.Bind(point);
    socket.Listen(10);
    Thread thread = new Thread(AcceptInfo);
    thread.IsBackground = false;
    thread.Start(socket);
}
catch (Exception ex)
{
    ShowMsg(ex.Message);
}
void AcceptInfo(object o)
{
    Socket socket = o as Socket;
    ShowMsg("开始检测!");
    while (true)
    {
        try
        {
            Socket tSocket = socket.Accept();
            string point = tSocket.RemoteEndPoint.ToString();
            ShowMsg(point + "连接成功!");
            dic.Add(point, tSocket);
            Send(point, point);
            Thread th = new Thread(ReceiveMsg);
            th.IsBackground = true;
            th.Start(tSocket);
        }
        catch (Exception ex) { break; }
    }
}
void ShowMsg(string msg)
{
    Console.WriteLine(msg);//这是对服务器情况汇报的方式
}
void ReceiveMsg(object o)
{
    Socket client = o as Socket;
    while (true)
    {
        try
        {
            byte[] buffer = new byte[1024 * 1024];
            int n = client.Receive(buffer);
            string words = Encoding.UTF8.GetString(buffer, 0, n);
            ShowMsg(client.RemoteEndPoint.ToString() + " : " + words);
        }
        catch (Exception ex) { break; }
    }
}
void Send(string ip, string str)//发送消息直接调用这个函数,方法:Send("IP:端口",内容);
{
    try
    {
        byte[] buffer = Encoding.UTF8.GetBytes(str);
        dic[ip].Send(buffer); 
    }
    catch (Exception ex)
    {
        ShowMsg(ex.Message);
    }
}

  • 写回答

2条回答 默认 最新

  • 砂糖~砂糖~ 2022-11-18 20:36
    关注

    在百度翻找7h后,得到了答案
    这类socket一旦出问题,很复杂
    127.0.0.1和0.0.0.0均可以运行监听但无法连接
    最终解决办法为服务器用私网ip监听
    客户端用公网ip监听
    虽然我不理解,但是真的运行并且连接成功了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月26日
  • 已采纳回答 11月18日
  • 创建了问题 11月16日

悬赏问题

  • ¥15 u盘问题:盘符不显示 无媒体
  • ¥50 R语言读取nc按月均值转为tif
  • ¥30 智能车串级pid调参
  • ¥15 visual studio code翻译老是错误
  • ¥20 卫星测高数据的高程转换
  • ¥15 爬取招聘网站数据信息
  • ¥15 安装完tensorflow,import tensorflow as tf后报错,如何解决?
  • ¥15 ultralytics库导出onnx模型,模型失去预测能力
  • ¥15 linux下点对点协议连接2个USB串口的硬件流量控制问题
  • ¥15 SQL数据自动生成问题