首页 新闻 会员 周边

C# 基于UDP的SOCKET聊天获取发送信息方IP的问题

0
悬赏园豆:50 [待解决问题]
View Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace UdpServer
{
    public partial class Server : Form
    {
        public Server()
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
        }
        Socket connectionSocket = null;
        private void btnStart_Click(object sender, EventArgs e)
        {
            connectionSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(txtIp.Text.Trim()), Convert.ToInt32(txtPort.Text.Trim()));
            connectionSocket.Bind(iPEndPoint);
            Thread acceptThread = new Thread(Accept);
            acceptThread.IsBackground = true;
            acceptThread.Start();
        }
        void Accept()
        {
            while (true)
            {
                byte[] by = new byte[1024];
                IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
                EndPoint iPEndPoint = (EndPoint)sender;
                int rev = connectionSocket.ReceiveFrom(by, ref iPEndPoint);
                txtReceiveMsg.AppendText(DateTime.Now + " " + iPEndPoint.ToString() + " 说:" + System.Text.Encoding.Default.GetString(by, 0, rev) + "\r\n");

            }

        }
        Socket sendSocket = null;
        private void btnSend_Click(object sender, EventArgs e)
        {
            sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            IPEndPoint iPEndPoint = new IPEndPoint(IPAddress.Parse(txtIp.Text.Trim()), 10002);
            EndPoint endPoint = (EndPoint)iPEndPoint;
            sendSocket.SendTo(System.Text.Encoding.Default.GetBytes(txtSendMsg.Text.Trim()), iPEndPoint);
        }

    }
}

发的是服务端代码,客户端代码和服务端代码几乎一样 只是端口改下而已,希望高手帮忙解答下。就是为什么客户端或者服务端接收到对方的信息后,端口为什么会变而不是绑定的端口?

等待冰柠檬的主页 等待冰柠檬 | 初学一级 | 园豆:35
提问于:2012-04-29 22:42
< >
分享
所有回答(4)
0

就你這個代碼,應該是用一個connectionSocket,不要發送的時候,再生成一個socket。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-04-30 08:07
0

因为在服务端有两个Socket对象,一个负责接收连接请求,另一个负责通信(接发信息)。

oceanstar1230 | 园豆:202 (菜鸟二级) | 2012-05-01 15:37
0

Bind方法绑定的是接受用的端口,并不是发送用的端口

code++ | 园豆:202 (菜鸟二级) | 2012-06-20 00:14
0

园子里已经有非常成熟的通信框架ESFramework,可以用来做类似QQ的IM软件,支持P2P,传文件,而且还可以支持语音视频聊天,我们公司就是用的该框架来开发视频会议系统的。可以参考一下。

C#开源即时通讯GGTalk | 园豆:162 (初学一级) | 2013-04-26 10:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册