无法接受传入连接 Winsock2

failed to accept incoming connection winsock2

本文关键字:连接 Winsock2      更新时间:2023-10-16

我的代码在控制台应用程序中运行良好。现在我正在尝试使用 GUI 嵌入它 wxDev.顺序为:

  1. virtual char* start()=0;
  2. virtual char* version()=0;
  3. virtual char* creat()=0;
  4. virtual char* bin()=0;
  5. virtual char* lis()=0;
  6. 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;

此外,您没有正确检查返回值。 bindlisten成功后返回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;
  }
};

顺便说一句,如果人们调查他们获得帮助的时间,应该尝试遵循他们的建议并接受请求的帮助。