C++ 我的服务器代码(c+;+;)有什么问题
我几乎完成了这个服务器的制作,但在我完成之前,我想测试它,但当我这样做的时候,它总是在任何人连接到它之前说“已连接”。我想让它说,当有人真的连接到它时,“连接已达到”。有什么帮助吗C++ 我的服务器代码(c+;+;)有什么问题,c++,client,C++,Client,我几乎完成了这个服务器的制作,但在我完成之前,我想测试它,但当我这样做的时候,它总是在任何人连接到它之前说“已连接”。我想让它说,当有人真的连接到它时,“连接已达到”。有什么帮助吗 #pragma comment(lib, "Ws2_32.lib") #include<iostream> #include<WinSock2.h> using namespace std; int main() { WSAData wsa; int iresult =WS
#pragma comment(lib, "Ws2_32.lib")
#include<iostream>
#include<WinSock2.h>
using namespace std;
int main()
{
WSAData wsa;
int iresult =WSAStartup(MAKEWORD(2,1), &wsa);
SOCKADDR_IN Server;
Server.sin_addr.s_addr=inet_addr("127.0.0.1");
Server.sin_family = AF_INET;
Server.sin_port = 6667;
SOCKET Listen =(AF_INET,SOCK_STREAM,NULL);
listen (Listen, SOMAXCONN);
bind(Listen,(SOCKADDR*)&Server,sizeof(Server));
SOCKET Connect =(AF_INET,SOCK_STREAM,NULL);
int size = sizeof(Server);
std::cout<<"Waiting for connections";
for(;;)
{
if(Connect=accept(Listen,(SOCKADDR*)&Server,&size)) {
std::cout<<"connection was reached";
break;
}
}
WSACleanup();
cin.get();
return 0;
}
#pragma注释(lib,“Ws2_32.lib”)
#包括
#包括
使用名称空间std;
int main()
{
WSAData wsa;
int-iresult=WSAStartup(MAKEWORD(2,1)和wsa);
服务器中的SOCKADDR_;
Server.sin_addr.s_addr=inet_addr(“127.0.0.1”);
Server.sinu family=AF\u INET;
Server.sin_port=6667;
套接字侦听=(AF_INET,SOCK_STREAM,NULL);
听着(听着,索马克斯康);
绑定(侦听,(SOCKADDR*)和服务器,sizeof(服务器));
套接字连接=(AF_INET,SOCK_STREAM,NULL);
int size=sizeof(服务器);
一个问题是:
Server.sin_port = 6667;
端口号必须按网络字节顺序排列,这与普通x86平台的字节顺序相反
Server.sin_port = htons(6667);
您的代码还存在许多其他问题,例如Joachim Isaksson在评论中指出的问题
还有一点:
if(Connect=accept(Listen,(SOCKADDR*)&Server,&size))
您必须记住,accept
在出错时返回SOCKET\u ERROR
(或-1
),即“true”SOCKET Listen=(AF\u INET,SOCK\u STREAM,NULL);
和SOCKET Connect=(AF\u INET,SOCK\u STREAM,NULL)
在这种情况下没有什么意义。也许它们应该被调用?@JoachimIsaksson那么我应该摆脱它吗?如果我应该,我该怎么做呢?我想说的是你可能想写SOCKET Listen=SOCKET(AF_INET,SOCK_STREAM,NULL)
@JoachimIsaksson我已经修复了。你看到我的代码还有什么问题吗?那么你是说如果(Connect=accept(Listen,(SOCKADDR*)和Server,&size))不应该在那里还是什么?如果不应该,应该是什么?就是这样confusing@user2626734我的意思是,无论是正确的接受还是出现错误,条件都是正确的。首先调用accept
,然后分别检查错误,这样可能会更容易。