C# TCP连接

问题描述

我想写一个客户端和服务端,使用TCP连接,比如服务端开放某个端口,客户端发送连接请求,在服务端能查看到发出连接请求的多个客户端IP地址,然后选择其中一个进行一对一连接。请问服务端能看到多个连接请求的这个列表该如何写,谢谢各位大神!

解决方案

解决方案二:

网上有代码,你搜吧,c#socket通讯
解决方案三:

撸主,你描述的这个就是socket通讯,一句两句也说不清楚,你度娘找个例子,先把socket通讯搞清楚。
解决方案四:

首先你定义一个字典,存客户端唯一标识号和tcpclient,每次新的添加就在字典上保存,如果断开就除掉。其中的逻辑判断你自己可以搞定,那么这字典的长度就是连接的客户端
解决方案五:

建议自行封装TcpListener,TcpClient类。http://honordream.blog.hexun.com/2858506_d.html
解决方案六:

服务器端不可能主动连接客户端,否则就不是服务器端了。只有在客户端连接服务器端并且传送自己的信息之后,服务器端才能“看到”客户端的信息。例如publicabstractclassMyServer:TcpListener{publicList<Session>lst=newList<Session>();//...................}publicclassSession{publicTcpClientClient;public客户端信息Passport;//其它属性,例如心跳报警时间长度,等等}

你的服务中有一个“连接列表”,当Accept到一个客户端连接时,就根据TcpListener.Accept()获取到的TcpClient对象来创建一个Session对象并加入列表中。然后在相关Client的Receive信息时,客户端传送来的“客户端信息”被更新到服务器端自己的列表中。当你想找某个客户端,例如(凡是“女的、80岁以上的”用户),来群发消息,那么就到这个列表中去关联查找相应的Session,并可以知道用哪一个TcpClient来推送消息。
解决方案七:

解决方案八:

我的意思是有个列表能看见客户端向服务端发送的多个地址的连接请求列表,然后再选择其中一个同意请求并开始连接。
解决方案九:

那你多个客户端的请求,在服务器端进入队列就好额,显示出该队列,然后你选定了个客户端,发送一个信息给客户端,表示你已经同意了请求,然后继续之后的通讯了。也就是说,那些客户端请求来连接的,其实已经连接上了,但是,只是你在服务端不去处理它,等选择一个后,再通知客户端客户端也是在接收到服务端的指定确认信息后,才会有会话了。
解决方案十:

引用7楼u012634379的回复:

我的意思是有个列表能看见客户端向服务端发送的多个地址的连接请求列表,然后再选择其中一个同意请求并开始连接。

那就不叫做服务器端。你得服务端是客户,你的客户端才是服务,这样你的服务端才能“开始连接”。先搞清楚什么叫做客户端、服务器端,这样比较好。要知道,服务器端不可能“开始连接客户端”,而是客户端“开始连接服务端”。另外,当客户端在各种nat路由的后边(1层或者多层),你根本无法访问它。比如说我现在这个电脑的IP是192.168.0.2,在我家里(有6、7个设备使用路由器),而上几层的出口是某电信研究院机房(它下面至少有几万个设备通过它上公网),那么我电脑不去访问csdn服务器,csdn得服务器有怎么可能穿过这一层层的路由器、层次交换机来主动地”开始连接“我的192.168.0.2?
解决方案十一:

程序设计要遵循最基本的原理知识,不可能凭空编造流程。所以遇到基本概念的问题你就是绕不过去的。如果不给你”很不客气地“说明白你的基本知识上的欠缺,你反而会听不进去真正具有可执行力的设计者的忠告的。
解决方案十二:

先恶补基础,不要空想
解决方案十三:

楼主,你的服务端不是全心全意为客户端服务的么,居然还要手动选择,这种设计很糟糕。所有客户端都应该是平等的,只要连上来就建立好通道了,两方随时可发送数据,如果需要验证,那是后面的事。
解决方案十四:

代码很多,只写服务端监听和客户端连接;后面还有客户端发送,服务器端接收等等///<summary>///启动服务器程序,开始监听客户端请求///</summary>publicvirtualvoidStart(){try{Socket_svrSock;//初始化socket_svrSock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//绑定端口IPEndPointiep=newIPEndPoint(IPAddress.Any,_port);_svrSock.Bind(iep);//开始监听_svrSock.Listen(500);//设置异步方法接受客户端连接_svrSock.BeginAccept(newAsyncCallback(AcceptConn),_svrSock);}catch(Exceptionex){log.WriteError(null,"启动服务器程序,开始监听客户端请求","",ex);if(ex.InnerException!=null)ex=ex.InnerException;//WriteLogs.WriteLog("TcpSvr_Start:"+ex.Source+"thrown"+ex.GetType().ToString()+"<br/>"+ex.Message.Replace("r","").Replace("n","<br/>")+"<br/>"+ex.StackTrace.Replace("r","").Replace("n","<br/>"),WriteLogs.LogType.Exception);}}///<summary>///连接服务器///</summary>///<paramname="ip">服务器IP地址</param>///<paramname="port">服务器端口</param>publicvirtualvoidConnect(stringip,intport){if(IsConnected){//重新连接Debug.Assert(_session!=null);Close();}Socketnewsock=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPointiep=newIPEndPoint(IPAddress.Parse(ip),port);newsock.BeginConnect(iep,newAsyncCallback(Connected),newsock);}
解决方案十五:

当你能看到客户端列表的时候,客户端已经和服务端链接成功了,不然你怎么知道是哪个客户端啊?你在服务端做的无非是,选择一个客户端并和客户端通讯,而不是选择客户端再连接。
解决方案:就像打电话给110一样,110事先是不知道谁要报案,那个报案的人在哪的,只能报案的人主动打给110,警察叔叔知道你在哪后,才能去帮你吧
解决方案:引用11楼Z65443344的回复:

先恶补基础,不要空想

我这里所谓的基础,绝对不仅仅是socket的用法,甚至不是C#这门语言你得把网络基础恶补一下,啥叫服务端,啥叫客户端,啥叫TCP连接,3次握手网络基础都不知道,就开始写代码,那完全是在空想
解决方案:度娘,谷歌,一大堆
解决方案:你这个要求很怪异,其实客户端可以都连接上,然后从中选择进行通信,未被选择另做处理

时间: 2024-10-03 01:28:36

C# TCP连接的相关文章

如何干掉一条tcp 连接(活跃/非活跃)

如何干掉一条tcp 连接(活跃/非活跃) 背景 最近在测试环境部署服务的时候老是会有端口被占用情况用netstat/ss 查看后发现端口一直被占用 同另外一个ip 建立了tcp 连接,类似于这样: ESTAB 0 0 192.168.103.169:12345 192.168.103.12:10261 当然这个问题也不是最近才遇到,之前也遇到过,不过之前都是很快这个连接就自动消失,我就可以欢快 的使用我自己喜欢的12345 端口,无奈这次一直连续好几天这个连接一直存在导致我一直无法使用这个端口.

一分钟了解阿里云产品:性能测试通过SLB保持百万级TCP连接C1M

一直以来,对SLB的转发性能到底如何比较好奇.于是,最近开了一个测试用的SLB来玩玩C1M,即我们能不能通过一个SLB来保持1百万个TCP长连接?     我的测试配置如下:   1个内网SLB,端口配置8000->8001, TCP按最小连接数转发. 3个后端server ECS,配置4核4G ram. 17个client ECS,配置1核2G ram. server是一个简单的echo service, client每秒向SLB发起500个TCP连接请求,建连后每隔20秒向server发送一

tcp连接探测Keepalive和心跳包

采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是我们需要的.我们希望服务器端和客户端都能及时有效地检测到连接失效,然后优雅地完成一些清理工作并把错误报告给用户. 如何及时有效地检测到一方的非正常断开,一直有两种技术可以运用.一种是由TCP协议层实现的Keepalive,另一种是由应用层自己实现的心跳包. TCP默认并不开启Keepalive功能,

linux网络编程之TCP/IP基础(四) TCP连接的建立和断开、滑动窗口

一.TCP段格式: TCP的段格式如下图所示 源端口号与目的端口号 源端口号和目的端口号,加上IP首部的源IP地址和目的IP地址唯一确定一个TCP连接. 序号 序号表示在这个报文段中的第一个数据字节序号. 确认号 仅当ACK标志为1时有效.确认号表示期望收到 的下一个字节的序号. 头部长度 4位,TCP头部最多60个字节,最少20个字节 保留位 6位,必须为 0 6个标志位 URG-紧急指针有效 ACK-确认序号有效 PSH-接收方应尽快将这个报文段交给应用层 RST- 连接重置 SYN-同步序

java-网游服务器 为什么可以建立多个tcp连接

问题描述 网游服务器 为什么可以建立多个tcp连接 我希望用java实现100万左右tcp连接数,为什么网游服务器可以支持那么多连接,是如何做到的, 不太了解集群,集群服务器可以实现吗? 解决方案 集群,实际上有很多台服务器,不同的客户端连接到不同的服务器,总的支持100万连接

《Linux高性能服务器编程》——3.3 TCP连接的建立和关闭

3.3 TCP连接的建立和关闭 本节我们讨论建立和关闭TCP连接的过程. 3.3.1 使用tcpdump观察TCP连接的建立和关闭 首先从ernest-laptop上执行telnet命令登录Kongming20的80端口,然后抓取这一过程中客户端和服务器交换的TCP报文段.具体操作过程如下: $ sudo tcpdump -i eth0 –nt '(src 192.168.1.109 and dst 192.168.1.108) or (src 192.168.1.108 and dst 192

网络编程-哪位大神能告诉我TCP连接池是干吗用的

问题描述 哪位大神能告诉我TCP连接池是干吗用的 如题,通俗易懂的说法有吗?我们老师说是一个包,那我应该怎么管理它 解决方案 http://zhuweisky.cnblogs.com/archive/2006/03/16/351301.html 解决方案二: 凡是带有"池"的,比如数据库连接池.对象池.缓冲区池(后面可以看到IBuffPool)等等,都是为了避免资源的反复创建/销毁所带来的开销.需要为哪些资源对象建立"池"了?这些资源对象通常符合下面几个特性: (1

高性能网络编程4&amp;#8211;TCP连接的关闭

作者:陶辉 TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么. 为方便阅读,我们可以带着以下5个问题来阅读本文: 1.当socket被多进程或者多线程共享时,关闭连接时有何区别? 2.关连接时,若连接上有来自对端的还未处理的消息,会怎么处理? 3.关连接时,若连接上有本进程待发送却未来得及发送出的消息,又会怎么处理? 4.so_linger这个功能的用处在哪? 5.对于监听socket执行关闭,和对处于ESTABLISH这种通讯的socket执行

libevent (二) 接收TCP连接

Evconnlistener 机制为您提供了侦听和接受传入的 TCP 连接的方法.下面的函数全部包含在`<event2/listener.h>`中. evconnlistener 创建监听对象 struct evconnlistener *evconnlistener_new(struct event_base *base,evconnlistener_cb cb, void *ptr, unsigned flags, int backlog,evutil_socket_t fd); stru

tcp连接-TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗?

问题描述 TCP连接时,服务端监听socket接收客户端连接后新创建的socket默认绑定的端口是监听端口吗? 比如用来监听连接的socket绑定23端口,服务端每接受一个连接都新开一个线程和客户端通信,并把新socket传递给新线程,是不是所有新创建的socket都是经过23端口和客户端通信? 解决方案 是的,都通过端口23进行通信 解决方案二: 都是监听端口,如果不是客户端就不能将数据发送到服务器 解决方案三: 23只是监听建立连接,后续数据交换走实际上端口