C++服务器端未阻止listen()
C++ server side not blocking on listen()
下面的代码没有阻塞listen(),它只是完成了执行。你能告诉我为什么吗?(initWSA返回true,我检查了它)。我正在学习一个教程,有人告诉我它应该屏蔽,因为它正在寻找连接的客户端。
#include <iostream>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
#define PORT 10000
bool initWSA(){
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
if (error) return false;
if (wsadata.wVersion != 0x0202){
WSACleanup();
return false;
}
return true;
}
void closeConnection(SOCKET s)
{
//Close the socket if it exists
if (s)
closesocket(s);
WSACleanup(); //Clean up Winsock
}
int main(){
initWSA();
SOCKET s;
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET) cout << "INVALID SOCKET" << endl;
if (bind(s, (LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR){
cout << "SOCKET ERROR" << endl;
}
listen(s, SOMAXCONN);
//cout << "CAUGHT ONE" << endl;
//closeConnection(s);
return 0;
}
首先,让我们明确listen()
和accept()
函数的确切语义。
侦听功能:
侦听函数将套接字置于侦听传入连接的状态。
备注:
要接受连接,首先使用socket函数创建套接字,然后使用bind功能绑定到本地地址。传入连接的囤积是用listen指定的,然后用accept函数接受连接。面向连接的套接字,例如类型为SOCK_STREAM的套接字,与listen一起使用。套接字s被置于被动模式,其中传入的连接请求被确认并排队等待进程的接受。
accept函数:
accept函数允许套接字上的传入连接尝试。
备注:
accept函数提取套接字s上挂起连接队列中的第一个连接。然后创建一个句柄并返回给新套接字。新创建的套接字是将处理实际连接的套接字;它具有与套接字s相同的属性,包括向WSAAsyncSelect或WSAEventSelect
如果队列中不存在挂起的连接,并且套接字标记为阻塞,则accept函数可以阻塞调用者,直到存在连接。如果套接字被标记为非阻塞,并且队列中不存在挂起的连接,accept将返回如下所述的错误。成功完成accept返回一个新的套接字句柄后,接受的套接字不能用于接受更多的连接。原始套接字保持打开状态,并侦听新的连接请求。
适当的示例(来源):
...
//----------------------
// Listen for incoming connection requests.
// on the created socket
if (listen(ListenSocket, 1) == SOCKET_ERROR) {
wprintf(L"listen failed with error: %ldn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
//----------------------
// Create a SOCKET for accepting incoming requests.
SOCKET AcceptSocket;
wprintf(L"Waiting for client to connect...n");
//----------------------
// Accept the connection.
AcceptSocket = accept(ListenSocket, NULL, NULL);
if (AcceptSocket == INVALID_SOCKET) {
wprintf(L"accept failed with error: %ldn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
} else
wprintf(L"Client connected.n");
// No longer need server socket
closesocket(ListenSocket);
...
相关文章:
- 服务器端事件C++实现?
- 如何使用 GRPC c++ 读取异步服务器端流
- QAbstractSocket 从服务器端关闭连接时的奇怪行为
- 从服务器端关闭主套接字
- 在GRPC服务器端呼叫时检索SSL证书
- BLE在Linux环境中使用C++的服务器端实现
- 如何在服务器端验证用户请求(在我的特定情况下)
- 如何检测端口是否已在服务器端使用(在windows上的C++中)
- RPC C++服务器端动态终结点
- 如果另一侧失去了他的净连接,我该如何从客户端/服务器端检测
- 如何使用php级别以下的代码进行服务器端编程
- 在没有 SO_LINGER > 0 的情况下强制关闭服务器端套接字可能会丢失数据,对吧?
- 提升ASIO TCP,为什么我不能在服务器端只有一个数据套接字可以打开和关闭
- FTP服务器端口处于主动模式和被动模式
- MongoDB C++驱动程序服务器端查询计数
- CORBA C++/Java应用程序中服务器端的分段故障(核心转储)
- 正在比较服务器端收到的字符串-C++
- 如何在boostc++中添加http服务器端口的路径
- MySQL 服务器端超时
- C++服务器端未阻止listen()