Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Accept()(Winsock 2)停止程序_C++_Sockets_Winsock2 - Fatal编程技术网

C++ Accept()(Winsock 2)停止程序

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应该让程序继续运行,直到出现特定连接)

问题是,我的朋友有一个非常类似的程序(不是多线程的),它同时充当客户机和服务器,而且完全可以工作。我正在尝试完成同样的事情,并且
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);
}