C++插座表现得很奇怪
C++ sockets acting weird
我正在尝试建立一个服务器,但accept()函数有问题。问题是,它接受空连接(我不知道它们来自哪里),并且它还从它们那里接收空的东西。
这是我的服务器.cpp类
#include "Server.h"
#include <thread>
Server::Server()
{
usercount = 0;
int RetVal=0;
WSAData wsaData;
WORD DllVersion=MAKEWORD(2,1);
RetVal=WSAStartup(DllVersion,&wsaData);
if( RetVal != 0 )
{
MessageBoxA(NULL,"WinSocket startup failed","Error",MB_OK | MB_ICONERROR );
exit(1);
}
}
bool Server::ServerStartUp()
{
sListen = socket(AF_INET, SOCK_STREAM, NULL);
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
addr.sin_addr.s_addr = inet_addr("192.168.0.100");
addr.sin_port = htons(69);
addr.sin_family = AF_INET;
bind(sListen, (SOCKADDR*)&addr,sizeof(addr));
listen(sListen,64);
// CreateThread(0,0,&Server::ServerThread,0,0,0);
std::thread t1(&Server::ServerThread,this);
t1.join();
return true;
}
void Server::ServerThread()
{
int addrlen = sizeof(addr);
for(;;Sleep(10))
{
if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen ))
{
cout << " FUTU ";
char* UserName = new char[256];
ZeroMemory(UserName,256);
recv(sConnect,UserName,256,0);
char* Password = new char[256];
ZeroMemory(Password,256);
recv(sConnect,Password,256,0);
users[ ++usercount ] = new Client(UserName,Password,sConnect);
if( users[usercount] ->GetLogInSuccesful() )
send(sConnect,"0x0001",6,0);
else
send(sConnect,"0x0002",6,0);
}
}
}
我还有一个结构几乎完全相同的工作示例,所以我不知道我在哪里做错了什么......
工作示例:
int ReturnValue = 0;
ReturnValue = InitWinSocket();
if(ReturnValue != 0)
{
MessageBoxA(NULL,"WinSocket startup failed","Error",MB_OK | MB_ICONERROR );
exit(1);
}
users = new User[64];
sListen = socket(AF_INET, SOCK_STREAM, NULL);
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
addr.sin_addr.s_addr = inet_addr("192.168.0.100");
addr.sin_port = htons(1234);
addr.sin_family = AF_INET;
bind(sListen, (SOCKADDR*)&addr,sizeof(addr));
listen(sListen,64);
int addrlen = sizeof(addr);
for(;;)
{
if(sConnect = accept(sListen , (SOCKADDR*)&addr,&addrlen))
{
int SuccesfulLogIn = 0;
SuccesfulLogIn = CheckLogInInformation();
if(SuccesfulLogIn == 0)
{
send(sConnect,"0x0002",6,0);
}
else
{
users[++ConnectionsCounter].UserConnection = sConnect;
users[ConnectionsCounter].ID = ConnectionsCounter;
users[ConnectionsCounter].IsUserInGame = false;
cout<<"Smb Connected";
send(sConnect,"0x0001",6,0);
char* Id = new char[20];
_itoa ( users[ConnectionsCounter].ID,Id,10 );
send(sConnect,Id,sizeof(Id),0);
UserThreadHandler[ConnectionsCounter] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)UserThread,(LPVOID)ConnectionsCounter,0,0);
}
}
}
在第二个示例中,它只接受正确的连接,并且实际上在点击 accept() 时等待,直到找到连接。
我想知道我做错了什么。
因评论而编辑:
发现实际上是我的绑定函数不起作用,我该如何解决这个问题?
我的猜测是,您正在尝试侦听特权端口(低于 1024 的端口),该端口不允许运行程序的用户执行此操作。 bind(), listen(), accept() 等返回指示成功或失败的值 -- 你永远不应该在没有检查这些返回值的情况下调用它们。
相关文章:
- 蓝牙插座只能读取一次,为什么?
- Asio端接插座功能:取消、关闭、关闭、释放
- 提升 ASIO 打开多个插座
- 网络插座 |无法设置on_close/打开处理程序
- ZMQ:连接 ZMQ 插座时"Resource temporarily unavailable"
- 如何通过插座传输 ESP32-Cam 拍摄的图像?
- UDP客户端/服务器程序在不同的IP和端口上通信超过2个插座
- 如何通过pthread发送插座ID
- TOS字段从Linux的TCP插座上接收到的数据包获取
- 不同网络之间的插座编程
- 如何通过1024字节缓冲区和强力冲洗在插座连接上发送6个字符的C弦
- Python/C 远程TCP插座
- 我可以使用Windows上使用ASIO(非凸轮)打开2048个插座
- C DO插座关闭自己的运行时间
- 插座无法接收数据?客户使用boost.asyio库编写.服务器用Python编写
- QT如何显示,请等待对话框,而插座正在等待响应
- 如何在转移中间处理一半的插座
- 发送和接收所有数据(C 插座)
- 当另一端将其关闭时,插座发生了什么
- Windows插座随机接受和接收