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++ (WinSocket)断开连接时发送垃圾邮件_C++_Sockets_Chat - Fatal编程技术网

C++ (WinSocket)断开连接时发送垃圾邮件

C++ (WinSocket)断开连接时发送垃圾邮件,c++,sockets,chat,C++,Sockets,Chat,我正在尝试为客户机/服务器聊天程序编写服务器。 唯一的问题是,一旦客户端断开连接,服务器就会开始向服务器发送最后一条消息。即使他们重新连接,它也会继续发送垃圾邮件。我试过谷歌搜索,但什么也找不到。 以下是服务器代码: #include "MasterServer.h" using namespace std; SOCKADDR_IN Server; int addrlen = sizeof(Server); SOCKET sListen; SOCKET Connect; SOCKET* Con

我正在尝试为客户机/服务器聊天程序编写服务器。 唯一的问题是,一旦客户端断开连接,服务器就会开始向服务器发送最后一条消息。即使他们重新连接,它也会继续发送垃圾邮件。我试过谷歌搜索,但什么也找不到。 以下是服务器代码:

#include "MasterServer.h"
using namespace std;
SOCKADDR_IN Server;
int addrlen = sizeof(Server);
SOCKET sListen;
SOCKET Connect; 
SOCKET* Connections;
int port = 444;
int ConCounter = 0;
char* Recv = new char[256];
int ServerThread(int ID)
{

ZeroMemory(Recv, sizeof(Recv));
for(;;)
{
    if(recv(Connections[ID],Recv ,256 ,NULL))
    {
        cout << Recv << endl;
    }
}
}

int InitWinSock()
{
int RetVal = 0;
      WSAData wsa;
      WORD Version = MAKEWORD(2,1);
      RetVal = WSAStartup(Version, &wsa);

      return RetVal;
}


int main()
{
    int RetVal = 0;
    RetVal = InitWinSock();
    if(RetVal != 0)
    {
        cout << "WinSock Start Up Failure";
    }
      Connections = (SOCKET*)calloc(64, sizeof(SOCKET));

       sListen = socket(AF_INET, SOCK_STREAM, NULL);
       Connect = socket(AF_INET, SOCK_STREAM, NULL);
       cout << "\t\t----====ModernBacon Server====----"<< endl;

        cout << "What Port Would You Like To Run On [Default 444]: ";
        cin >> port;

        system("cls");
      Server.sin_addr.s_addr = inet_addr("127.0.0.1");
      Server.sin_family = AF_INET;
      Server.sin_port = htons(port);

      bind(sListen, (SOCKADDR*)&Server, sizeof(Server));
      //Listening
      listen(sListen, 64);
cout << "Listening For Connections IP:"<<inet_ntoa(Server.sin_addr);"Port:"<<port<< 
endl;


      for(;;)
          {
            if(Connect = accept(sListen, (SOCKADDR*)&Server, &addrlen))
            {
                Connections[ConCounter] = Connect;
                char* ID = new char[64];
                ZeroMemory(ID, sizeof(ID));
                itoa(ConCounter, ID, 10);
                send(Connections[ConCounter], ID, sizeof(ID),NULL);

                ConCounter = ConCounter + 1;
                CreateThread(NULL,NULL, (LPTHREAD_START_ROUTINE) 
ServerThread, (LPVOID)(ConCounter -1), NULL, NULL);

                cout << "\t\tClient Connected!\tID: " <<
ConCounter << endl;



            }

      }
      return(0);
}
#包括“MasterServer.h”
使用名称空间std;
服务器中的SOCKADDR_;
int addrlen=sizeof(服务器);
套筒滑脱;
插座连接;
插座*连接;
int端口=444;
int ConCounter=0;
char*Recv=新字符[256];
int服务器线程(int ID)
{
零内存(Recv,sizeof(Recv));
对于(;;)
{
if(recv(连接[ID],recv,256,NULL))
{

cout您的代码有很多问题。请尝试类似以下内容:

#include "MasterServer.h"
#include <string>

using namespace std;

static const int MAX_CLIENTS = 64;
static const int MAX_RECV = 256;

struct ClientInfo
{
    int ID;
    SOCKET Connection;
    char Recv[MAX_RECV];
};

ClientInfo Clients[MAX_CLIENTS];

DWORD WINAPI ServerThread(LPVOID lpParam)
{
    ClientInfo *Client = (ClientInfo*) lpParam;
    char szID[64] = {0};

    itoa(Client->ID, szID, 10);

    int RetVal = send(Client->Connection, szID, sizeof(szID), NULL);
    if (RetVal != sizeof(szID))
    {
        cout << "Client " << Client->ID << " Send Failure. Error " << WSAGetLastError() << endl;
    }
    else
    {
        do
        {
            RetVal = recv(Client->Connection, Client->Recv, MAX_RECV, NULL);
            if (RetVal == SOCKET_ERROR)
            {
                cout << "Client " << Client->ID << " Recv Failure. Error " << WSAGetLastError() << endl;
                break;
            }

            if (RetVal == 0)
            {
                cout << "Client " << Client->ID << " disconnected" << endl;
                break;
            }

            cout << "Client " << Client->ID << ": " << string(Client->Recv, RetVal) << endl;
        }
        while (true);
    }

    closesocket(Client->Connection);
    Client->Connection = INVALID_SOCKET;

    return 0;
}

int InitWinSock()
{
    WSAData wsa;
    return WSAStartup(MAKEWORD(2,1), &wsa);
}

int main()
{
    SOCKADDR_IN addr;
    int addrlen;
    SOCKET sListen;
    SOCKET sClient;
    int port = 444;
    int index;

    cout << "\t\t----====ModernBacon Server====----"<< endl;

    for (int i = 0; i < MAX_CLIENTS; ++i)
        Connections[i] = INVALID_SOCKET;

    int RetVal = InitWinSock();
    if (RetVal != 0)
    {
        cout << "WinSock Start Up Failure. Error " << RetVal << endl;
        return 0;
    }

    sListen = socket(AF_INET, SOCK_STREAM, NULL);
    if (sListen == INVALID_SOCKET)
    {
        cout << "WinSock Socket Failure. Error " << WSAGetLastError() << endl;
        return 0;
    }

    cout << "What Port Would You Like To Run On [Default 444]: ";
    cin >> port;
    system("cls");

    ZeroMemory(&addr, sizeof(addr));
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);

    RetVal = bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
    if (RetVal != 0)
    {
        cout << "WinSock Bind Failure. Error " << WSAGetLastError() << endl;
        return 0;
    }

    //Listening
    RetVal = listen(sListen, MAX_CLIENTS);
    if (RetVal != 0)
    {
        cout << "WinSock Listen Failure. Error " << WSAGetLastError() << endl;
        return 0;
    }

    cout << "Listening For Connections. IP: " << inet_ntoa(addr.sin_addr) << ", Port: " << port << endl;

    do
    {
        addrlen = sizeof(addr);
        sClient = accept(sListen, (SOCKADDR*)&addr, &addrlen);
        if (sClient == INVALID_SOCKET)
        {
            cout << "WinSock Accept Failure. Error " << WSAGetLastError() << endl;
            return 0;
        }

        index = -1;
        for (int i = 0; i < MAX_CLIENTS; ++i)
        {
            if (Clients[i].Connection == INVALID_SOCKET)
            {
                 index = i;
                 break;
            }
        }

        if (index == -1)
        {
            closesocket(sClient);
            cout << "\t\tClient Connected. Max Clients Exceeded!" << endl;
            continue;
        }

        Clients[index].ID = index + 1;
        Clients[index].Connection = sClient;

        CreateThread(NULL, NULL, &ServerThread, &Clients[index], NULL, NULL);

        cout << "\t\tClient Connected!\tID: " << Clients[index].ID << endl;
    }
    while (true);

    return 0;
}
#包括“MasterServer.h”
#包括
使用名称空间std;
静态常量int MAX_CLIENTS=64;
静态常数int MAX_RECV=256;
结构ClientInfo
{
int-ID;
插座连接;
char Recv[MAX_Recv];
};
ClientInfo客户端[最大客户端];
DWORD WINAPI服务器线程(LPVOID lpParam)
{
ClientInfo*客户端=(ClientInfo*)lpParam;
char szID[64]={0};
itoa(客户->ID,szID,10);
int RetVal=send(客户端->连接,szID,sizeof(szID),NULL);
if(RetVal!=sizeof(szID))
{

你知道吗
recv
出错时会返回什么吗?当客户端断开连接时,分配给它们的线程永远不会消失。当一个新客户端被分配给该连接ID时,会发生什么?另外,所有线程共享同一个缓冲区,用于从套接字读取。这是另一个灾难。垃圾邮件是发送垃圾邮件的行为。这是一个错误这里没有电子邮件代码。在这个上下文中,你说的“垃圾邮件”到底是什么意思?@EJP spamming在这里的上下文中使用的是正确的。垃圾邮件是指在互联网上不分青红皂白地向(大量收件人)发送同一条消息。他指的是消息会一次又一次地被重新发送。