积极答复者
string 互转 EndPoint

问题
-
我在服务端里面得到了下面的结果
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 发不过去信息 发局域网行,广域网不行
- 已移动 Sheng Jiang 蒋晟Moderator 2013年5月15日 19:12
答案
-
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
全部回复
-
设备是正常的
我的问题是 有路由 每个客户端都
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 就发不出去了
-
客户端代码:
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
服务端的发送代码要怎么写? 注意 : 客户端有路由, 且 没有映射 端口
-
我说过 服务端 和 客户端 的代码 完全一样,我就是想每个客户端都做一个服务器
就算服务端不在线,客户端也能和只到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:03
-
我是初学者, 我不懂你说的那些, 我的想法是: 我的代码好像没有没题 ,只是你给我想复杂了
我在描述一下我的要求:
客户端要想做服务端就得 在 路由器里面 映射端口 ,可不可以不映射端口也能收到外网发来的数据
就像 客户端 发一个数据到 服务端(服务端映射了端口的) 服务端就可以回发到客户端(客户端没有映射端口)
我想要的结果就是:
服务端没有客户端的(EndPoint) ,只有客户端(客户端没有映射端口)的 ip 和 端口 怎么才可以发过去,要 udp 的 什么写法都可以,我没有要求,只要能发到 (没有映射端口) 的客户端就行
也可以这么说:就是知道客户端的 ip 和 端口 要怎么才可以 穿过路由器 发到 目标 电脑去
是不是只知道 ip 和 端口 还不够 还要知道些什么
- 已编辑 求真相 2013年5月16日 5:30
-
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