多线程winsock服务器不接受客户端c ++

时间:2015-08-09 00:01:39

标签: c++ multithreading winsock

所以我有一个winsock应用程序,其中计算机尝试接受一个客户端,然后使用指向具有客户端信息的类对象的指针启动一个新线程,然后使用delete关键字删除它。 骨干被复制,但OOP结构的开头是我的工作,目前的实现似乎给了我一些问题。 我注意到套接字可能没有以正确的格式复制,但不知道如何解决这个问题。当客户端尝试连接时,它会抛出服务器拒绝连接的错误消息。无论如何,这是服务器的代码。

更新 它正在工作。

// main.h
#pragma once

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <process.h>
#include <cstring>
#include <iostream>
#include <stdio.h>
#include <memory>


#pragma comment(lib,"ws2_32.lib" )

class clientData{
private:
    SOCKET clientSocket;
    std::string name;

public:
    clientData(SOCKET &clientSock, const char *tName);

    clientData(clientData *cliDat);

    ~clientData();

    inline SOCKET *getClientSocket(){
        return &clientSocket;
    }

    inline std::string *getName(){
        return &name;
    }

};

这是主要的cpp文件

// main.cpp
#include "main.h"



unsigned int __stdcall  ServClient(void *data);

int main(int argc, char *argv[])
{

    WSADATA wsaData;
    int iResult;
    sockaddr_in addr;
    SOCKET sock, client[10];

    addr.sin_family = AF_INET;
    addr.sin_port = htons(13337);
    addr.sin_addr.S_un.S_addr = INADDR_ANY;

    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);//2.2 

    if (iResult)
    {
        printf("WSA startup failed");
        return 0;
    }


    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (sock == INVALID_SOCKET)
    {
        printf("Invalid socket");
        return 0;
    }
    int addrlen = sizeof(sockaddr_in);
    iResult = bind(sock, (sockaddr*)&addr, sizeof(sockaddr_in));

    if (iResult)
    {

        printf("bind failed %u", GetLastError());

        return 0;
    }

    iResult = listen(sock, SOMAXCONN);

    if (iResult)
    {

        printf("iResult failed %u", GetLastError());

        return 0;
    }

    int iterationCount = 0;
    while ((iterationCount < 10 && 
        (client[iterationCount] = accept(sock, (SOCKADDR*)&addr, &addrlen)) != SOCKET_ERROR))
    {
        if (client[iterationCount] == INVALID_SOCKET){
            printf("invalid client socket",GetLastError());
            continue;
        }   

        ++iterationCount;
        char tempName[100] = { '\0' };
        sprintf_s(tempName, sizeof(tempName), "Client %u", iterationCount);
        clientData *tempCLdata = new clientData(client[iterationCount - 1], tempName);
        _beginthreadex(0, 0, ServClient, (void*)tempCLdata, 0, 0);
        tempCLdata = nullptr;
    }


    return 0;
}

unsigned int __stdcall ServClient(void *data)
{
    clientData cliDat((clientData*)data);
    delete (clientData*)data;
    printf("Client connected\n");

    int recvLen = 1;
    char chunk[1024] = { '\0' };
    while ((recvLen = recv(*cliDat.getClientSocket(), chunk, 1024, 0)) > 0){
        printf("%.*s", recvLen, chunk);
    }
    if (recvLen == -1)
        perror("Socket recv() problem..\n");
    else
        printf("End of data on socket, closing..\n");

    closesocket(*cliDat.getClientSocket());

    return 0;
}



clientData::clientData(SOCKET &clientSock, const char *tName){
    clientSocket = clientSock;
    name.assign(tName);
}

clientData::clientData(clientData *cliDat){

    SOCKET *clientSocketPtr = cliDat->getClientSocket();
    clientSocket = *clientSocketPtr;
    name.assign(cliDat->getName()->c_str());
}

clientData::~clientData(){
}

此处是客户端代码的相关位,如请求的那样。

    char buffer[1023] = { '\0' };
    int heartbeatCount = 0;
    while (true)
    {
        sprintf_s(buffer, sizeof(buffer), "Heartbeat %d", heartbeatCount + 1);
        send(sock, buffer, strlen(buffer) + 1, 0);
        ++heartbeatCount;
        Sleep(1000);
    }

0 个答案:

没有答案