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();
}