如果我想接受一个连接,我会调用accept
,但是如何拒绝一个连接呢?
在一个工作的socket回声客户端中,我有这个if语句。在回声服务器中,我该如何使回声客户端达到这个printf
语句?
...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
printf("Connecting failed\n");
return 1;
}
...
如果我想接受一个连接,我会调用accept
,但是如何拒绝一个连接呢?
在一个工作的socket回声客户端中,我有这个if语句。在回声服务器中,我该如何使回声客户端达到这个printf
语句?
...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
printf("Connecting failed\n");
return 1;
}
...
struct linger lo = { 1, 0 };
setsockopt(s, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo));
close(s);
accept(..)
调用将始终返回客户端详细信息。没有办法窥视连接并有选择性地拒绝。你现在所做的方式实际上是正确的:接受然后关闭。如果您在此层之上有其他消息结构,则可以创建自定义“拒绝消息”。这个选项完全取决于您的用例。accept
调用处于您的控制流中。只有当您等待accept
时,您的程序才会等待套接字连接,否则永远不会。accept()
该连接,然后立即关闭它。WSAAccept()
函数。它提供了一个回调函数,允许应用程序基于每个连接来决定是否接受、拒绝或将其保留在等待队列中。在成功接受客户端连接后,关闭监听服务器套接字并在客户端连接由于任何原因而断开后重新建立它可能会很有帮助。
accept()
函数接受客户端连接后,关闭监听服务器套接字。不幸的是,您必须接受或拒绝才能从侦听队列的前面删除条目。我说这很不幸的原因是,在被拒绝和没有得到响应(超时)之间,连接机器之间存在明显的差异。
如果黑客正在使用端口扫描器,他们将知道您正在监听该端口,如果您拒绝,他们就可以开始入侵。能够在不做任何操作的情况下从队列的前面删除条目,并使另一端的人不知道您在该端口上进行侦听,这将是很好的。