如何在服务器端获取客户端访问的端口(服务器端开启了多个端口供客户端访问)

解决方案 »

  1.   

    服务器端与客户端的断口保持一致就可以了,至于用哪个端口,可以自由选择.例如://服务器端
    TcpServerChannel channel=new TcpServerChannel(8086);
    ChannelServices.RegisterChannel(channel);
    RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerObject),"Connection",WellKnownObjectMode.SingleCall);//客户端
    ChannelServices.RegisterChannel(new TcpClientChannel());
    sql.ServerObject obj = (ServerObject)Activator.GetObject(typeof(ServerObject),"tcp://192.168.0.20:8086/connection");
      

  2.   

    // Summary:
        //     Defines how well-known objects are activated.
        [Serializable]
        [ComVisible(true)]
        public enum WellKnownObjectMode
        {
            // Summary:
            //     Every incoming message is serviced by the same object instance.
            Singleton = 1,
            //
            // Summary:
            //     Every incoming message is serviced by a new object instance.
            SingleCall = 2,
        }你用的 SingleCall?
    要区分吗
      

  3.   

    IAuthorizeRemotingConnection 可以吗?
      

  4.   

    withcsharp()
    能说的具体点吗
      

  5.   

    IAuthorizeRemotingConnection 接口提供了一些方法,可根据客户端的网络地址和用户标识来指示客户端是否被授权连接至当前信道。
    public TcpServerChannel (
    IDictionary properties,
    IServerChannelSinkProvider sinkProvider,
    IAuthorizeRemotingConnection authorizeCallback
    )
      

  6.   

    http://community.csdn.net/Expert/topic/5054/5054452.xml?temp=.7828333
      

  7.   

    using System;
    using System.Collections;
    using System.IO;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Channels;
    using System.Threading;
    using System.Net;
    using System.Security.Principal;namespace r
    {
        public class Remotable : MarshalByRefObject
        {        private int callCount = 0;        public int GetCount()
            {            callCount++;
                return (callCount);
            }    }
        public class cmyLogin : IAuthorizeRemotingConnection
        {
            public bool IsConnectingEndPointAuthorized(EndPoint endPoint)
            {
                if (endPoint.AddressFamily.ToString() != "")
                    return true;
                else
                    return true;
            }
            public bool IsConnectingIdentityAuthorized(IIdentity identity)
            {
                return true;
            }    }
        public class ClientIPServerSinkProvider : IServerChannelSinkProvider
        {
            private IServerChannelSinkProvider next = null;
            public ClientIPServerSinkProvider()
            {        }        public void GetChannelData(IChannelDataStore channelData)
            {        }        public IServerChannelSink CreateSink(IChannelReceiver channel)
            {
                IServerChannelSink nextSink = null;
                if (next != null)
                {
                    nextSink = next.CreateSink(channel);
                }
                return new ClientIPServerSink(nextSink);
            }        public IServerChannelSinkProvider Next
            {
                get { return next; }
                set { next = value; }
            }
        }    public class ClientIPServerSink : BaseChannelObjectWithProperties, IServerChannelSink, IChannelSinkBase
        {        private IServerChannelSink _next;        public ClientIPServerSink(IServerChannelSink next)
            {
                _next = next;
            }        public void AsyncProcessResponse(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers, System.IO.Stream stream)
            {        }        public Stream GetResponseStream(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers)
            {
                return null;
            }        public System.Runtime.Remoting.Channels.ServerProcessing ProcessMessage(System.Runtime.Remoting.Channels.IServerChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage requestMsg, System.Runtime.Remoting.Channels.ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Messaging.IMessage responseMsg, out System.Runtime.Remoting.Channels.ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
            {            if (_next != null)
                {
                    IPAddress ip = requestHeaders[CommonTransportKeys.IPAddress] as IPAddress;                Console.WriteLine(ip.ToString());                CallContext.SetData("ClientIPAddress", ip);                ServerProcessing spres = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);                return spres;            }            else
                {                responseMsg = null;                responseHeaders = null;                responseStream = null;                return new ServerProcessing();            }        }        public IServerChannelSink NextChannelSink
            {            get { return _next; }            set { _next = value; }        }    }}
      

  8.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Security.Permissions;
    using System.Runtime.Serialization.Formatters;
    using System.Collections;
    using r;
    namespace WindowsApplication12
    {    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private System.Runtime.Remoting.Channels.Tcp.TcpServerChannel serverChannel;
            private BinaryServerFormatterSinkProvider serverProvider;
            private ClientIPServerSinkProvider IPProvider;
            private cmyLogin mylogin;
            private void Form1_Load(object sender, EventArgs e)
            {
                mylogin=new cmyLogin();
                serverProvider = new BinaryServerFormatterSinkProvider();
                IPProvider = new ClientIPServerSinkProvider();            IPProvider.Next = serverProvider;//链接上下一个provider
                serverProvider.TypeFilterLevel = TypeFilterLevel.Full;            IDictionary props = new Hashtable();
                props["port"] = 9090;
                props["id"] = string.Empty;            serverChannel =
                new TcpServerChannel(props, IPProvider,mylogin);            RemotingConfiguration.RegisterWellKnownServiceType(
                   typeof(Remotable), "Remotable.rem", WellKnownObjectMode.Singleton
               );            // Show the name and priority of the channel.
                Console.WriteLine("Channel Name: {0}", serverChannel.ChannelName);
                Console.WriteLine("Channel Priority: {0}", serverChannel.ChannelPriority);            // Show the URIs associated with the channel.
                ChannelDataStore data = (ChannelDataStore)serverChannel.ChannelData;
                foreach (string uri in data.ChannelUris)
                {
                    Console.WriteLine(uri);
                }            // Wait for method calls.
                Console.WriteLine("Listening...");
            }
        }
    }
      

  9.   

    谢谢 withcsharp() 
    我正在看...
      

  10.   

    还是先结了吧,
    很感谢,withcsharp() 
    最后的结果 我做好后再贴出来给大家.