aaronwxj 2021-01-16 17:43 采纳率: 0%
浏览 48

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条回答 默认 最新

  • aaronwxj 2021-01-16 17:51
    关注

    这个c++多线程服务器真是很难啊

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题