Accept()(Winsock 2)停止程序

时间:2015-03-13 11:41:37

标签: c++ sockets winsock2

我有一个程序既可以作为客户端也可以作为服务器而不需要多线程(据我所知,接受应该让程序继续运行,直到发生某个连接)。

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

Server.cpp(两个变量SOCKET _socketstruct sockaddr_in _details):

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);
}

并且client.cpp无关紧要,因为它甚至不会遇到其代码。

为什么会这样?为什么我的朋友有一个代码没有多线程同时拥有客户端和服务器。顺便说一句,发送和接收是我实现的功能。

0 个答案:

没有答案