C++ C服务器套接字接受没有请求的客户端

C++ C服务器套接字接受没有请求的客户端,c++,c,sockets,C++,C,Sockets,我会保持简单。 代码: #包括“stdafx.h” #包括 #包括 #包括 #包括 #包括 int _tmain(int argc,_TCHAR*argv[] { WSADATA WSADATA; int error=WSAStartup(0x0202,&wsadata); if(error)printf(“WinSock error!”); 套接字服务器; 服务器地址中的结构sockaddr\u; 服务器地址sin家庭=AF网络; 服务器地址sin端口=htons(5657); 服务器地址si

我会保持简单。
代码:

#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
WSADATA WSADATA;
int error=WSAStartup(0x0202,&wsadata);
if(error)printf(“WinSock error!”);
套接字服务器;
服务器地址中的结构sockaddr\u;
服务器地址sin家庭=AF网络;
服务器地址sin端口=htons(5657);
服务器地址sin地址s地址=htonl(INADDR\U ANY);
服务器=套接字(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET)printf(“INVALID SOCKET!”);
error=bind(服务器,(LPSOCKADDR)和服务器地址,sizeof(服务器地址));
如果(错误)printf(“连接错误!”);
监听(服务器,SOMAXCONN);
printf(“服务器已建立!正在侦听…\n”);
客户机地址中的sockaddr\u;
套接字客户端;
client=accept(server,(struct sockaddr*)和client_addr,(int*)sizeof(client_addr));
如果(客户端==无效的_套接字)printf(“无效套接字!\n”);
printf(“客户!”);
closesocket(服务器);
WSACleanup();
getch();
返回0;
}

但我得到的是:

服务器已建立!听。。。 无效的插座! 客户

我在C#中做过套接字,我猜服务器应该侦听并等待客户端,每当客户端请求连接时,服务器都应该接受,但服务器不等待就接受套接字,而这个接受的套接字也是无效的!为什么会发生这种情况?我如何解决它?

这:

(int *)sizeof(client_addr)
是错误的,您正在将大小转换为指针

socklen_t client_addr_len = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_len);
这:

是错误的,您正在将大小转换为指针

socklen_t client_addr_len = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_len);
您正在将client\u addr大小强制转换为int*,因此您有一个指向地址的指针,该地址等于client\u addr的大小

您需要执行以下操作:

socklen_t clntAddrLen = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &clntAddrLen);
这种方式是不同的,因为您有一个类型为socklen\u t的变量,它保存客户端地址的大小。然后,您将得到一个指针(带&),该指针指向包含该数字的内存地址,这就是您想要的

您正在将client\u addr大小强制转换为int*,因此您有一个指向地址的指针,该地址等于client\u addr的大小

您需要执行以下操作:

socklen_t clntAddrLen = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &clntAddrLen);
这种方式是不同的,因为您有一个类型为socklen\u t的变量,它保存客户端地址的大小。然后,您将得到一个指针(带&),该指针指向包含该数字的内存地址,这正是您所需要的。

问题可能是,它将尝试写入提供给它的最后一个参数

改为:

int client_addr_size = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_size);
检查的值将提供失败的原因。

问题可能是试图写入提供给它的最后一个参数

改为:

int client_addr_size = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_size);

检查的值将提供失败的原因。

返回什么?返回什么?该死!我打了这个:)+1打我。谢谢,但我发现socklen\u t没有定义!任何替代结构???看起来像
int
都应该可以:(只需将
socklen\u t
替换为
int
,而不是
int*
)。该死!我打了这个:)+1打我。谢谢,但我发现socklen\u t没有定义!任何类似于
int
的替代结构都应该可以:(只需将
socklen\u t
替换为
int
,而不是
int*
)。您好。谢谢,但我发现socklen\u t没有定义!有其他结构吗???我正在使用Visual Studio 2010。socklen_t类型是在windows中的WS2TCPP.h中定义的。这不是winsock2.h(AFAICT)中附带的。您需要手动包含ws2tcpp.h才能使用socklen\u t类型。-这是从Hi那里拍的。谢谢,但我发现socklen\u t没有定义!有其他结构吗???我正在使用Visual Studio 2010。socklen_t类型是在windows中的WS2TCPP.h中定义的。这不是winsock2.h(AFAICT)中附带的。您需要手动包含ws2tcpp.h才能使用socklen\u t类型。-取自