无法接受传入连接 Winsock2
failed to accept incoming connection winsock2
我的代码在控制台应用程序中运行良好。现在我正在尝试使用 GUI 嵌入它 wxDev
.顺序为:
-
virtual char* start()=0;
-
virtual char* version()=0;
-
virtual char* creat()=0;
-
virtual char* bin()=0;
-
virtual char* lis()=0;
-
virtual char* acc()=0;
从 0 到 4 所有功能都运行良好,当acc()
接受功能被称为剂量没有反应时。我的代码:
#include <winsock2.h>
#include <winsock.h>
int inn=100;
char error[]={":::::I M HERE::::::"};
char chaa[]={"Inside LIKE FUNCTION.n"};
char st[]={"Starting...n"};
char ve[]={"Compatable Verstion.n"};
char cr[]={"Socket Created.n"};
char bi[]={"Binding Done.n"};
char li[]={"Listeng..........n"};
char ac[]={"Connected..........n"};
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
SOCKET socket(int af, int type, int protocol);
int connect(SOCKET s, const struct sockaddr *name, int namelen);
int bind(SOCKET s, const struct sockaddr *name, int namelen);
int listen(SOCKET s, int backlog);
class Server
{
public:
SOCKET sockh;
SOCKET socka;
WSADATA wsadata;
sockaddr_in sockAddr, client;
public:
char* like(){return chaa;}
int kiss(){return inn++;}
virtual char* start()=0;
virtual char* version()=0;
virtual char* creat()=0;
virtual char* bin()=0;
virtual char* lis()=0;
//virtual char* acc()=0;
};
class startup: public Server
{
public:
char* start(){
if(WSAStartup(MAKEWORD(2,0), &wsadata)==0)
return st;
}
};
class ver:public startup{
public:
char* version(){
if(LOBYTE(wsadata.wVersion)>=2)
return ve;
}
};
class created: public ver {
public:
char* creat(){
if(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)!=INVALID_SOCKET)
return cr;
}
};
class binded: public created{
public:
// Bind socket to port 80
char* bin()
{
// sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(7777);
sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (bind(sockh, (sockaddr*)(&sockAddr), sizeof(sockAddr))!=0)
return bi;
}
};
class listenn: public binded
{
public:
char* lis(){
if(listen(sockh, SOMAXCONN)!=0)
{
return li;
}
}
};
class accep: public listenn{
public:
char* acc(){
int siz=sizeof(client);
socka=accept(sockh,reinterpret_cast<sockaddr*>(&sockAddr),&siz);
if(socka!=INVALID_SOCKET)
return ac;
else return error;
}
};
我也尝试避免在同一类中返回语句。
SOCKET sockh;
SOCKET socka;
WSADATA wsadata;
sockaddr_in sockAddr, client;
if(WSAStartup(MAKEWORD(2,0), &wsadata)==0)
{
if(LOBYTE(wsadata.wVersion)>=2)
{
if(socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)!=INVALID_SOCKET)
{
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(7777);
sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (bind(sockh, (sockaddr*)(&sockAddr), sizeof(sockAddr))!=0)
{
if(listen(sockh, SOMAXCONN)!=0)
{
//waiting for incoming connection
int siz=sizeof(client);
socka=accept(sockh,reinterpret_cast<sockaddr*> (&sockAddr),&siz);
if(socka!=INVALID_SOCKET)
{
return "Connected...";
}
}
}
}
}
}
您从不设置变量sockh
。您应该为其分配 socket
的返回值:
if((sockh = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET)
return cr;
此外,您没有正确检查返回值。 bind
和listen
成功后返回0
。
编辑:
因为它似乎难以理解,所以这里整个代码按预期工作:
class startup: public Server {
public:
char* start(){
if(WSAStartup(MAKEWORD(2,0), &wsadata)==0)
return st;
}
};
class ver:public startup {
public:
char* version(){
if(LOBYTE(wsadata.wVersion)>=2)
return ve;
}
};
class created: public ver {
public:
char* creat() {
if((sockh=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))!=INVALID_SOCKET)
return cr;
}
};
class binded: public created {
public:
// Bind socket to port 80
char* bin() {
// sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(7777);
sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (bind(sockh, (sockaddr*)(&sockAddr), sizeof(sockAddr))==0)
return bi;
}
};
class listenn: public binded {
public:
char* lis() {
if(listen(sockh, SOMAXCONN)==0)
return li;
}
};
class accep: public listenn {
public:
char* acc() {
int siz=sizeof(client);
socka=accept(sockh,reinterpret_cast<sockaddr*>(&sockAddr),&siz);
if(socka!=INVALID_SOCKET)
return ac;
else return error;
}
};
顺便说一句,如果人们调查他们获得帮助的时间,应该尝试遵循他们的建议并接受请求的帮助。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- WinSock2:connect() 提供"连接被拒绝"
- 如何使用 winsock2 实现与 c++ 的多个并行连接?
- C++ Winsock2 客户端未通过远程 IP 连接到服务器
- 无法接受传入连接 Winsock2
- 无法侦听并连接 Winsock2
- 如何检测 winsock2 中的异常断开连接
- Winsock2错误:服务器在连接到客户端时崩溃
- WinSock2:使用recv和send在单独的线程中处理接受的传入连接
- Winsock2 的 listen() 函数为每个端口查找一个连接;甚至那些不存在的?
- 在WinSock2, c++中连接到服务器,而在路由器后面
- 连接函数错误10047 (winsock2)