C++ Accept()(Winsock 2)停止程序
我有一个既作为客户端又作为服务器的程序,没有多线程(据我所知,accept应该让程序继续运行,直到出现特定连接) 问题是,我的朋友有一个非常类似的程序(不是多线程的),它同时充当客户机和服务器,而且完全可以工作。我正在尝试完成同样的事情,并且C++ Accept()(Winsock 2)停止程序,c++,sockets,winsock2,C++,Sockets,Winsock2,我有一个既作为客户端又作为服务器的程序,没有多线程(据我所知,accept应该让程序继续运行,直到出现特定连接) 问题是,我的朋友有一个非常类似的程序(不是多线程的),它同时充当客户机和服务器,而且完全可以工作。我正在尝试完成同样的事情,并且accept()停止程序 代码如下: //main.cpp #include <iostream> #include "Client.h" #include "Server.h" #pragma comment(lib, "Ws2_32.lib"
accept()
停止程序
代码如下:
//main.cpp
#include <iostream>
#include "Client.h"
#include "Server.h"
#pragma comment(lib, "Ws2_32.lib")
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
Server s(6666);
Client c("127.0.0.1", 6666);
cout << "Done";
WSACleanup();
return 0;
}
而且client.cpp
与此无关,因为它甚至没有遇到自己的代码
为什么会发生这种情况?为什么我的朋友有一个既有客户端又有服务器的没有多线程的代码。顺便说一下,发送和接收是我自己实现的功能。什么据我所知,accept应该让程序继续运行,直到某个连接发生'-err。。否。Accept()是一个阻塞调用。当客户端连接时,它会返回。而且,它不会停止“程序”,它只会阻止调用线程。@MartinJames那么为什么我朋友的程序是多线程的呢?更一般地说。。。当人们的程序出现问题时,我们希望他们在这里发布代码,这样有关它的声明就可以得到验证,观察结果也可以得到确认和解释。谈论你对朋友程序的回忆/理解而不列出相关代码是另一个方向的一步。如果你想知道它是如何工作的,为什么不看看或者问问他/她呢。@user3147306:所以这不是一个代码编写服务。有了非阻塞套接字的知识,5秒钟的谷歌搜索就可以找到,例如,这就足够了。我认为书籍、教程等的链接也是离题的。
Server::Server(unsigned short Port) : _socket(0)
{
this->_socket = socket(AF_INET, SOCK_STREAM, 0);
if (_socket < 0)
throw "Invalid socket";
ZeroMemory(&this->_details, sizeof(this->_details));
this->_details.sin_family = AF_INET;
this->_details.sin_port = htons(Port);
this->_details.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (bind(this->_socket, (const struct sockaddr*)&this->_details, sizeof(this->_details)) != 0)
{
throw "Bind Unsuccessful";
}
this->AcceptConnections();
}
void Server::AcceptConnections()
{
if (listen(this->_socket, SOMAXCONN) != 0)
throw "Listen Unsuccessful";
void* buf = NULL;
string ans("Accepted");
int client;
struct sockaddr_in client_addr;
int addrlen = sizeof(client_addr);
client = accept(this->_socket, (struct sockaddr*)&client_addr, &addrlen);
/*THIS IS WHERE THE PROGRAM STOPS... AWAITING CONNECTIONS*/
//NEVER REACHING THE CODE HERE
int recvBytes = this->Receive(buf, MY_MAX_LEN);
if (recvBytes <= 0)
{
throw "Client disconnected";
}
this->Send((void*)ans.c_str(), ans.length());
closesocket(client);
closesocket(this->_socket);
}