我有tcpclient对象,我想确定它是否已连接.我使用tcpclient的连接属性,但它返回上一次操作的状态.所以它没用.
那我用这个代码:
bool flag;
flag = (tcp.Client.Poll(10000, SelectMode.SelectWrite));
Run Code Online (Sandbox Code Playgroud)
和
if( tcp.Client.Poll( 0, SelectMode.SelectRead ) )
{
byte[] buff = new byte[1];
if( tcp.Client.Receive( buff, SocketFlags.Peek ) == 0 )
{
flag = false;
}
}
Run Code Online (Sandbox Code Playgroud)
但它无法正常工作.
任何的想法?
这是我在服务器端的代码:
private ArrayList _ClientList = new ArrayList();
public ClsServer(int port)
{
_TCPListener = new TcpListener(IPAddress.Any, port);
_TCPListener.Start();
Thread ListenThread = new Thread(new ThreadStart(ListenForClients));
ListenThread.IsBackground = true;
ListenThread.Start();
}
private void ListenForClients()
{
while (true)
{
//blocks until a client has connected to the …
Run Code Online (Sandbox Code Playgroud) 我学习了套接字使用的一个例子.在此示例中,客户端向服务器发送请求以打开套接字然后服务器(侦听特定端口)打开套接字并且一切正常,套接字从双方(客户端和服务器)"打开".
但我仍然不清楚这些东西有多灵活.例如,客户端是否可以关闭打开的(从两端)套接字并再次重新打开它(在服务器保持套接字打开的情况下).
服务器是否可以"知道"客户端上的套接字已关闭?客户端是否可以知道服务器端的套接字已关闭?
添加:
对我来说更重要的一件事.如果应用程序(无主服务器或客户端)崩溃,异常终止,被杀,会发生什么?它会关闭应用程序侧面打开的所有套接字吗?
增加2:
如果套接字一侧的应用程序被关闭(终止,关闭,终止)然后再次打开(在相同的IP地址和相同的端口上),该怎么办?我们应该在两个应用程序之间创建一个新套接字,还是可以使用旧套接字(在崩溃之前创建).
众所周知,当连接的一侧崩溃时,不可能检测到连接丢失。您必须在 TCP 级别或应用程序协议级别在两端设置 keepalive。
参考:
但是如果对等点在同一台 Linux 机器上并且其中一个出现段错误,另一个是否会通过在下一次读取调用中接收到错误来检测到这种情况?
所有描述符都关闭了,对吧?那不应该正确关闭连接吗?(如果网络出现故障,则是内核故障,无论如何每个人都注定要失败)
我正在尝试获得 FIFO 的这个不错的功能:当您关闭一端时,另一端会收到错误/信号。
我对PHP的套接字库有一个奇怪的问题:我似乎无法检测/区分服务器EOF,因此我的代码无助地进入无限循环.
进一步说明如下; 首先,一些背景(这里没有什么特别的花哨):
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8081);
for (;;) {
$read = [$socket];
$except = NULL;
$write = [];
print "Select <";
$n = socket_select($read, $write, $except, NULL);
print ">\n";
if (count($read)) {
print "New data: ";
#socket_recv($socket, $data, 1024, NULL);
$data = socket_read($socket, 1024);
print $data."\n";
}
print "Socket status: ".socket_strerror(socket_last_error())."\n";
}
Run Code Online (Sandbox Code Playgroud)
上面的代码只是连接到服务器并打印它读取的内容.它是我正在编写的小型套接字库中的缩减版本.
为了测试,我目前正在使用ncat -vvklp 8081
绑定套接字并成为服务器.随着运行,我可以启动上面的代码,它连接和工作 - 例如,我可以键入ncat
窗口,PHP接收它.(从PHP发送数据也有效,但我已将该代码排除在外,因为它不相关.)
然而,就在我的时刻^C
ncat
,上面的代码进入了一个硬无限循环 - 而且PHP说套接字上没有错误.
我试图弄清楚按钮在哪里打击PHP头部并使其意识到对等已断开连接.
socket_get_status()
是一个很大的用词 - 它是别名stream_get_meta_data() …
我正在使用epoll进行网络编程.我有一个连接列表,并将每个客户端放在列表中.如果用户正常断开,我可以通过读取0来检测用户断开连接.但是,如果用户以某种方式意外断开连接,那么在尝试向用户发送数据之前,它无法知道这一点.
我不认为epoll提供了一个处理这个问题的好方法.所以我想我应该自己处理这个问题.如果您能为我提供与此问题相关的示例或参考资料,我将非常感激.