C++ C++,一次接受后无法接收数据和无效套接字

C++ C++,一次接受后无法接收数据和无效套接字,c++,sockets,networking,C++,Sockets,Networking,我编写了一个POSIX-BSD套接字[Listener Client],但我有一个问题。我认为我的代码中有一个错误,但我不知道错误在哪里。我的操作系统是Windows 10 64位。我在本地主机上创建了一个带有EServer类的侦听器,并尝试通过ESocket连接到此侦听器。连接后,我可以将数据从ESocket发送到服务器套接字,但我无法在服务器套接字中接收它。而且,下一个传入连接将出现无效的\u套接字错误。以下是我的代码: ------------EServer.h--------------

我编写了一个POSIX-BSD套接字[Listener Client],但我有一个问题。我认为我的代码中有一个错误,但我不知道错误在哪里。我的操作系统是Windows 10 64位。我在本地主机上创建了一个带有EServer类的侦听器,并尝试通过ESocket连接到此侦听器。连接后,我可以将数据从ESocket发送到服务器套接字,但我无法在服务器套接字中接收它。而且,下一个传入连接将出现无效的\u套接字错误。以下是我的代码:

------------EServer.h-----------------
#ifndef服务器
#定义ESERVER_H
#包括
#包括
#包括
#包括
使用名称空间std;
#ifdef_WIN32
#ifndef\u WIN32\u WINNT
#定义_WIN32_WINNT 0x0501
#恩迪夫
#包括
#包括
#否则
输入插座;
#包括
#包括
#包括
#包括
#包括
#恩迪夫
类服务器
{
公众:
EServer(int端口);
虚拟~EServer();
int Destruct();
int Close();
bool isListening();
ESocket AcceptClient();
受保护的:
私人:
};
#endif//ESERVER\u H
----------------EServer.cpp-----------------
#包括“EServer.h”
#包括“stdio.h”
套接字sx=NULL;
EServer::EServer(int端口)
{
服务器中的结构sockaddr_;
//创建一个套接字
if((sx=socket(AF_INET,SOCK_STREAM,0))<0)
{
sx=NULL;
返回;
}
server.sinu family=AF\u INET;
server.sin\u addr.s\u addr=INADDR\u ANY;
server.sin_port=htons(端口);
//束缚
if(bind(sx,(struct sockaddr*)&server,sizeof(server))<0)
{
sx=NULL;
返回;
}
printf(“侦听状态:%i\r\n”,侦听(sx,100));
}
EServer::~EServer()
{
析构函数();
}
bool EServer::isListening()
{
返回(sx!=NULL);
}
ESocket EServer::AcceptClient()
{
客户端中的结构sockaddr_;
新插座;
#ifdef_WIN32
int c=sizeof(结构sockaddr_in);
new_socket=accept(sx,(struct sockaddr*)和client,&c);
if(新的\u套接字==无效的\u套接字)
{
printf(“无效”);
}
#否则
socklen_t c=sizeof(结构sockaddr_in);
new_socket=accept(sx,(struct sockaddr*)和client,&c);
如果(新的_插座<0)
{
}
#恩迪夫
返回ESocket(新的_插座);
}
inteserver::Destruct()
{
#ifdef_WIN32
返回WSACleanup();
#否则
返回0;
#恩迪夫
}
int EServer::Close()
{
int status=0;
#ifdef_WIN32
状态=关闭(sx和SD_均关闭);
如果(status==0){status=closesocket(sx);}
#否则
状态=关闭(sx,关闭\RDWR);
如果(状态==0){status=close(sx);}
#恩迪夫
返回状态;
}
---------------埃索凯特-------------------
#ifndef ESOCKET_H
#定义ESOCKET_H
#包括
#包括
#包括
使用名称空间std;
#ifdef_WIN32
#ifndef\u WIN32\u WINNT
#定义_WIN32_WINNT 0x0501
#恩迪夫
#包括
#否则
输入插座;
#包括
#包括
#包括
#包括
#包括
#恩迪夫
类电子钱包
{
公众:
ESocket(字符串ip,内部端口);
电子插座(插座e);
虚拟~ESocket();
int Destruct();
int Close();
int setAsNonBlock();
bool SendData(字符串数据);
布尔断开连接();
字符串接收数据(int len);
静态int Init()
{
#ifdef_WIN32
WSADATA wsa_数据;
返回WSAStartup(MAKEWORD(1,1)和wsa_数据);
#否则
返回0;
#恩迪夫
}
静态字符串getIP(字符*主机)
{
结构宿主*he;
地址**地址列表中的结构;
char-ip[100];
int i;
if((他=gethostbyname(主机))==NULL)
{
返回“”;
}
地址列表=(地址中的结构**)he->h\U地址列表;
对于(i=0;地址列表[i]!=NULL;i++)
{
strcpy(ip、inet_ntoa(*地址列表[i]);
}
字符串x=ip;
返回x;
}
受保护的:
私人:
};
#endif//ESOCKET\u H
--------------------ESocket.cpp---------------
#包括“ESocket.h”
#包括“stdio.h”
套接字s=NULL;
ESocket::ESocket(字符串ip,int端口)
{
服务器中的结构sockaddr_;
if((s=socket(AF\u INET,SOCK\u STREAM,0))<0)
{
s=零;
}
server.sin_addr.s_addr=inet_addr(ip.c_str());
server.sinu family=AF\u INET;
server.sin_port=htons(端口);
if(connect(s,(struct sockaddr*)&server,sizeof(server))<0
{
s=零;
}
}
ESocket::ESocket(插座e)
{
s=e;
}
ESocket::~ESocket()
{
析构函数();
}
bool-ESocket::isConnected()
{
返回(s!=NULL);
}
int-ESocket::Destruct()
{
#ifdef_WIN32
return wsaclenup();
#否则
返回0;
#恩迪夫
}
int-ESocket::Close()
{
int status=0;
#ifdef_WIN32
状态=关闭(s、SD_均关闭);
如果(status==0){status=closesocket;}
#否则
状态=关闭(s,关闭\RDWR);
如果(状态==0){status=close(s);}
#恩迪夫
s=零;
返回状态;
}
bool-ESocket::SendData(字符串数据)
{
if(发送(s,data.c_str(),data.length(),0)<0)
{
s=零;
返回false;
}
返回true;
}
字符串ESocket::ReceiveData(int len)
{
内部记录大小;
字符回复[len];
如果((recv_size=recv(s,reply,len,0))<0)
{
返回“”;
}
如果(recv_size==0)
{
s=零;
返回“”;
}
printf(“%i”,记录大小);
回复[recv_size]='\0';
回复;
}
int-ESocket::setAsNonBlock()
{
国际关系;
#ifdef_WIN32
u_long iMode=1;
res=ioctlsocket(s、FIONBIO和iMode);
#否则
int opts;
opts=fcntl(s,F_GETFL);
如果(选择<0)
{
res=-1;
}
opts=(opts | O|u非块);
如果(fcntl(s,F_设置FL,opts)<0)
{
res=-1;
}
#恩迪夫
返回res;
}
-------------主要--------------
ESocket::Init();
e服务器(105);
while(如isListening()){
ESocket x1(“127.0.0.1”,105);
printf(“连接”);
esocketx2=e.AcceptClient();
printf(“已接受的”);
x1.发送数据(“Ehem”);
printf(“已发送”);

cout问题是您对所有连接的套接字使用单个全局变量