none
string 互转 EndPoint RRS feed

  • 问题

  • 我在服务端里面得到了下面的结果

    string ip = ((IPEndPoint)state.EndPoint).Address.ToString;

    string 端口 = ((IPEndPoint)state.EndPoint).Port.ToString;

    我想把这个结果保存到数据库中,但是客户端里面没有映射端口,我要怎么才可以用数据库的这两个结果 发到客户机上去呢?

    直接在服务端 用 EndPoint 就可以发,为什么转为字符串了,就发不过去了呢?

    System.Net.IPAddress IPadr = System.Net.IPAddress.Parse(ip);
    //先把string类型转换成IPAddress类型
    System.Net.IPEndPoint EndPoint_ = new System.Net.IPEndPoint(IPadr, 端口);
    EndPoint EndPoint2 = (EndPoint)EndPoint_;

    得到的EndPoint2  发不过去信息 发局域网行,广域网不行


    2013年5月15日 8:17

答案

  • hi,

    若你认为代码没问题,应该就要能符合你的需求。

    对不起我,帮不上你,server - client 架构软体实作上有太多的组合性了。

    你可以参考以下的实作方式

    http://cs0.wikidot.com/chattingroom

    https://gist.github.com/aethur/72737

    http://csharp.net-informations.com/communications/csharp-chat-server-programming.htm

    http://www.codeproject.com/Articles/12893/TCP-IP-Chat-Application-Using-C

    http://www.geekpedia.com/tutorial239_Csharp-Chat-Part-1---Building-the-Chat-Client.html


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 求真相 2013年5月16日 5:48
    2013年5月16日 5:34

全部回复

  • hello,

    若设备没有上广域网,当然发不过去,先试着能否在广域网接收到讯习,若可以再考虑发送。


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年5月15日 9:10
  • 设备是正常的    

    我的问题是 有路由 每个客户端都

    IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 4162);
    m_sListen = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    m_sListen.Bind(ipe);
    IPEndPoint ipend = new IPEndPoint(IPAddress.Any, 0);
    EndPoint remote = (EndPoint)ipend;
    PostRecv(remote);

    我在服务端 要把 客户端的( EndPoint )转为字符串 存入 数据库 以备别人用这个发消息出去    客户端有路由 我是想不映射 端口 直接发到客户端,     不转为字符串能发出去,  只要转为字符串 在转回到 EndPoint  就发不出去了

    2013年5月15日 9:23
  • hi,

    我是依你提到的这句话,用来判断设备在广域网有问题
    "得到的EndPoint2  发不过去信息 发局域网行,广域网不行"

    接收得到的ip可能是固定的,但port可能是浮动的,你可以在观察看看


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年5月15日 9:31
  • IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 4162);
    客户端的端口 不是设置好了吗,怎么会浮动,    局域网不用映射端口,肯定发得过去,  广域网要映射端口,我是想不映射端口怎么发过去
    2013年5月15日 9:49
  • hi,

    你可观察 Socket 类别的以下两个属性

    RemoteEndPoint
    LocalEndPoint


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年5月15日 10:34
  • 客户端代码:


    private void ListenThreadMothed()
    {
    	try {
    		IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 4162);
    		m_sListen = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    		m_sListen.Bind(ipe);
    		IPEndPoint ipend = new IPEndPoint(IPAddress.Any, 0);
    		EndPoint remote = (EndPoint)ipend;
    		PostRecv(remote);
    	} catch (Exception ex) {
    		MsgBox(ex.Message);
    	}
    }
    private void PostRecv(EndPoint endPoint)
    {
    	try {
    		byte[] buffer = new byte[6000];
    		m_sListen.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, endPoint, EndRecv, new AsyncState(buffer, 0, buffer.Length, endPoint));
    	} catch (Exception ex) {
    		
    	}
    }
    private void EndRecv(IAsyncResult asyncResult)
    {
    	AsyncState state = null;
    	byte[] sendbuf;
    	try {
    		state = (AsyncState)asyncResult.AsyncState;
    		PostRecv(state.EndPoint);
    		int readBytes = m_sListen.EndReceiveFrom(asyncResult, state.EndPoint);
    		string content = Encoding.Default.GetString(state.Buffer, 0, readBytes);
    		
    	} catch (Exception ex) {
    		
    	}
    }
    private void PostSend(byte[] buffer, int offset, int size, EndPoint endPoint)
    {
    	try {
    		m_sListen.BeginSendTo(buffer, offset, size, SocketFlags.None, endPoint, EndSend, new AsyncState(buffer, offset, size, endPoint));
    	} catch (Exception ex) {
    		
    	}
    }
    private void EndSend(IAsyncResult asyncResult)
    {
    	try {
    		AsyncState state = (AsyncState)asyncResult.AsyncState;
    		byte[] buffer = state.Buffer;
    		int sendBytes = m_sListen.EndSendTo(asyncResult);
    		int remainBytes = state.Size - sendBytes;
    		if (remainBytes <= 0) {
    			return;
    		}
    		PostSend(buffer, buffer.Length - remainBytes, remainBytes, state.EndPoint);
    	} catch (Exception ex) {
    		
    	}
    }
    
    [Serializable(), StructLayout(LayoutKind.Sequential)]
    internal struct AsyncState
    {
    	private readonly byte[] m_buffer;
    	private readonly int m_offset;
    	private readonly int m_size;
    	public AsyncState(byte[] buffer, EndPoint endPoint)
    	{
    		if (endPoint == null) {
    			throw new ArgumentNullException("endPoint");
    		}
    		this.m_buffer = buffer;
    		this.m_offset = 0;
    		this.m_size = buffer.Length;
    		this.EndPoint = endPoint;
    	}
    
    	public AsyncState(byte[] buffer, int offset, int size, EndPoint endPoint)
    	{
    		if (buffer == null) {
    			throw new ArgumentNullException("array");
    		}
    		if (offset < 0) {
    			throw new ArgumentOutOfRangeException("offset", "ArgumentOutOfRange_NeedNonNegNum");
    		}
    		if (size < 0) {
    			throw new ArgumentOutOfRangeException("count", "ArgumentOutOfRange_NeedNonNegNum");
    		}
    		if ((buffer.Length - offset) < size) {
    			throw new ArgumentException("Argument_InvalidOffLen");
    		}
    		if (endPoint == null) {
    			throw new ArgumentNullException("endPoint");
    		}
    		this.m_buffer = buffer;
    		this.m_offset = offset;
    		this.m_size = size;
    		this.EndPoint = endPoint;
    	}
    
    	public byte[] Buffer {
    		get { return m_buffer; }
    	}
    
    	public int Offset {
    		get { return m_offset; }
    	}
    
    	public int Size {
    		get { return m_size; }
    	}
    
    	public EndPoint EndPoint;
    }

    例如,知道这个客户端ip地址和端口为:113.21.16.5:4162

    服务端的发送代码要怎么写?   注意 : 客户端有路由,  且 没有映射 端口

    2013年5月15日 11:05
  • 服务端 和 客户端 的代码差不多   

    byte[] sendbuf = Encoding.Default.GetBytes("123456");

    PostSend(sendbuf, 0, sendbuf.Length,这里要怎么写);

    //PostSend(sendbuf, 0, sendbuf.Length, (EndPoint)new IPEndPoint(Net.IPAddress.Parse(IP), 416));

    //这个发不过去 对方要是映射了端口就可以发过去,  我想要的是对方不映射端口也能发过去


    2013年5月15日 11:20
  • 所以你的客户端也用UDP?

    能否请你画张架构图,并观察server的remoteEndpoint以及localEndpoint

    或是提供专案


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年5月15日 17:06
  • 我说过 服务端 和 客户端 的代码 完全一样,我就是想每个客户端都做一个服务器

    就算服务端不在线,客户端也能和只到ip 和端口的用户聊天

    private void EndRecv(IAsyncResult asyncResult) { AsyncState state = null; byte[] sendbuf; try { state = (AsyncState)asyncResult.AsyncState; PostRecv(state.EndPoint); int readBytes = m_sListen.EndReceiveFrom(asyncResult, state.EndPoint); string content = Encoding.Default.GetString(state.Buffer, 0, readBytes); byte[] sendbuf = Encoding.Default.GetBytes(content); PostSend(sendbuf, 0, sendbuf.Length, state.EndPoint); //我只想知道这里为什么可以发过去 ////PostSend(sendbuf, 0, sendbuf.Length, (EndPoint)new IPEndPoint(Net.IPAddress.Parse("113.21.16.8"), 416)); //这样怎么发不过去, 你就 给我说这点要怎么写就行了 ,我试过把每个用户的EndPoint保存

    //但是这样只能服务端用,别的客户端用不了 所以就想转为字符串 } catch (Exception ex) { } }



    2013年5月16日 3:01
  • hi,

    从一开始,我就推测是port占用所以无法顺利进行收、发,所以才要你观察EndPoint。

    server-client 的架构的写法不只一种,所以我无法给你答案

    若区域网也能用字串转EndPoint收、发,网域网不行,那我也不知该如何处理,因为我无法模拟你的错误


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年5月16日 3:13
  • 我是初学者, 我不懂你说的那些,  我的想法是:   我的代码好像没有没题  ,只是你给我想复杂了    

    我在描述一下我的要求:

    客户端要想做服务端就得 在 路由器里面 映射端口   ,可不可以不映射端口也能收到外网发来的数据

    就像  客户端 发一个数据到 服务端(服务端映射了端口的) 服务端就可以回发到客户端(客户端没有映射端口)

    我想要的结果就是:

    服务端没有客户端的(EndPoint) ,只有客户端(客户端没有映射端口)的 ip 和 端口  怎么才可以发过去,要 udp 的  什么写法都可以,我没有要求,只要能发到  (没有映射端口) 的客户端就行

    也可以这么说:就是知道客户端的 ip 和 端口 要怎么才可以 穿过路由器 发到 目标 电脑去

    是不是只知道 ip 和 端口 还不够 还要知道些什么  


    2013年5月16日 5:23
  • hi,

    若你认为代码没问题,应该就要能符合你的需求。

    对不起我,帮不上你,server - client 架构软体实作上有太多的组合性了。

    你可以参考以下的实作方式

    http://cs0.wikidot.com/chattingroom

    https://gist.github.com/aethur/72737

    http://csharp.net-informations.com/communications/csharp-chat-server-programming.htm

    http://www.codeproject.com/Articles/12893/TCP-IP-Chat-Application-Using-C

    http://www.geekpedia.com/tutorial239_Csharp-Chat-Part-1---Building-the-Chat-Client.html


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 求真相 2013年5月16日 5:48
    2013年5月16日 5:34
  • 看来我的语文没学好,表达不清楚  

    2013年5月16日 5:48
  • hi,

    文字表达本来就会有盲点,所以才要麻烦你提供架构图以及专案

    建议你可透过书籍来内化功力

    http://tl.zxhsd.com/kgsm/ts/big5/2011/11/15/2112098.shtml

    http://tl.zxhsd.com/kgsm/ts/big5/2012/09/09/2344896.shtml


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年5月16日 5:54
  • 假如我是客户端:外网IP:113.15.32.6  内网IP:192.168.1.3   客户端绑定了一个端口:4162

    你要发一个信息过来,我没有在路由上映射端口,  你要怎么发过来呢,,用UDP    

    可以给我一个例子吗, 你给我的例子都是多人聊天的

    2013年5月16日 5:58
  • 这个问题最主要的就是  路由器不映射端口 ,发到外网IP  ,  内网里面的电脑收不到呀   ,内网里面那么多电脑,路由器会发到那个电脑去?
    2013年5月16日 6:01
  • hi,

    這又跟你一開始提问的不一样了,我一开始就回你,server 端要上广域网,要你先在区域网测试,广域网的环境又会更复杂,先测区域网,没问题在测广域网。

    路由可以指定对应的port


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年5月16日 7:04