aaronwxj
2021-01-16 17:43c++服务器(来一个新客户端启动一个线程)死锁
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条回答
为你推荐
- 为什么在同一个goroutine中使用未缓冲的通道会导致死锁
- concurrency
- channels
- 4个回答
- 从接收方关闭通道:从多个goroutine访问sync.Mutex时出现死锁
- channel
- mutex
- 2个回答
- 服务器和客户端之间的明显死锁
- server
- client
- networking
- 1个回答
- 一个带有死锁的Go Channel的简单示例,以及为什么
- channel
- goroutine
- 2个回答
- SpringBoot+JPA死锁问题
- spring
- maven
- hibernate
- eclipse
- java-ee
- 2个回答