张小桐 2021-06-12 16:21 采纳率: 0%
浏览 681

C#socket通信在服务器端使用Socket.RemoteEndPoint得到的客户端端口号不对

用指定的本地IP(127.0.0.1)地址端口号(例如8080)来新建服务器与客户端之间的socket连接,但是在服务器端用RemoteEndPoint端口号却是个很奇怪的数(不是8080),而且经常在变。

相关代码如下:

客户端:

//用于通信的Socket
Socket socketSend;
//用于监听的SOCKET
Socket socketWatch;

 //当点击开始监听的时候 在服务器端创建一个负责监听IP地址和端口号的Socket
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //获取ip地址
            IPAddress ip = IPAddress.Parse(this.txt_IP.Text.Trim());
            //创建端口号
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(this.txt_Port.Text.Trim()));
            //绑定IP地址和端口号
            socketWatch.Bind(point);
            this.txt_Log.AppendText("监听成功" + " \r \n");
            //开始监听:设置最大可以同时连接多少个请求
            socketWatch.Listen(10);

            //实例化回调
            setCallBack = new SetTextValueCallBack(SetTextValue);
            receiveCallBack = new ReceiveMsgCallBack(ReceiveMsg);
            setCmbCallBack = new SetCmbCallBack(AddCmbItem);
            //创建线程
            AcceptSocketThread = new Thread(new ParameterizedThreadStart(StartListen));
            AcceptSocketThread.IsBackground = true;
            AcceptSocketThread.Start(socketWatch);

private void StartListen(object obj)
        {
            //Socket socketWatch = obj as Socket;
            while (true)
            {
                //等待客户端的连接,并且创建一个用于通信的Socket
                socketSend = socketWatch.Accept();
                //获取远程主机的ip地址和端口号
                string strIp = socketSend.RemoteEndPoint.ToString();
                dicSocket.Add(strIp, socketSend);
                this.cmb_Socket.Invoke(setCmbCallBack, strIp);
                string strMsg = "远程主机:" + socketSend.RemoteEndPoint + "连接成功";
                //使用回调
                txt_Log.Invoke(setCallBack, strMsg);

                //定义接收客户端消息的线程
                Thread threadReceive = new Thread(new ParameterizedThreadStart(Receive));
                threadReceive.IsBackground = true;
                threadReceive.Start(socketSend);

            }
        }
  • 写回答

1条回答 默认 最新

  • We唯有自己强大 2022-04-12 13:23
    关注

    因为客户端t通信socket的端口是随机改变的。如果在服务端RemoteEndPoint获取到的是你客户端的IP和端口号。而客户端的IP和端口号是随机产生。你服务器端才是固定的8080。如果你在服务端想获取服务器端的IP和端口号。要用socket.LocakEndPoint

    评论 编辑记录

报告相同问题?

悬赏问题

  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据