wxjly20112011
aaronwxj
2021-01-16 17:43

c++服务器(来一个新客户端启动一个线程)死锁

  • c++
  • 开发语言

std::cout或者print  打日志;放久了也会死锁。

 

 

#include"stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <Mswsock.h>

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <stdio.h>
#include <memory>
#include <cstdint>
#include <io.h>
#include<vector>
#include<time.h>
#pragma comment(lib, "WS2_32.lib")
#include <mstcpip.h> 

using namespace std;

void timeloging(char* c)
{
    time_t timep;
    time(&timep);
    char tmp[64];
    strftime(tmp, sizeof(tmp), "%Y-%m-%d %H:%M:%S  ", localtime(&timep));
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);

    printf(tmp);
    printf(c);
    printf("\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}


static DWORD WINAPI _WorkerThreadProc(LPVOID lpParam)
{
    SOCKET AcceptSocket = (SOCKET)lpParam;

#define DEFAULT_BUFLEN 512

    int recvbuflen = DEFAULT_BUFLEN;
    
    timeloging("connect...");

    while (true)
    {
        char recvbuf[DEFAULT_BUFLEN] = "";
        int iResult = recv(AcceptSocket, recvbuf, recvbuflen, 0);
        if (iResult == 0 || iResult==-1)//客户端断开
        {
            break;
        }
        else
        {
            try {
                timeloging(recvbuf);

        
            }
            catch (...) {
                timeloging("error ocurr ");
            }
        }
        
        Sleep(0);

    }
    timeloging("leave...");
    return 0;

}


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

    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }


    SOCKET ListenSocket;
    ListenSocket = ::WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    SOCKADDR_IN si;
    si.sin_family = AF_INET;
    si.sin_port = ::ntohs(6001);
    si.sin_addr.S_un.S_addr = INADDR_ANY;
    if (::bind(ListenSocket, (sockaddr*)&si, sizeof(si)) == SOCKET_ERROR)
    {
        return FALSE;
    }

    if (listen(ListenSocket, 200) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    SOCKET AcceptSocket;
    wprintf(L"Waiting for client to connect...\n");


    while (true)
    {
        Sleep(0);
        sockaddr addr;
        int addrlen = sizeof(addr);
        AcceptSocket = accept(ListenSocket, &addr, &addrlen);
        HANDLE threadhandle = ::CreateThread(NULL, 0, _WorkerThreadProc, (LPVOID)AcceptSocket, 0, NULL);
        CloseHandle(threadhandle);

    }

    closesocket(ListenSocket);
    WSACleanup();


}
 

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

1条回答