#include<WinSock2.h>
#include<stdio.h>
#include<iostream>
#include<string>
#include<stdlib.h>
#pragma comment(lib,"ws2_32.lib")
#define UM_ASYNCSELECTMSG WM_USER+1
LRESULT CALLBACK WinBackProc(HWND hwndw, UINT msgID, WPARAM wparam, LPARAM lparam);
#define MAX_SOCK_COUNT 1024
SOCKET g_sockALL[MAX_SOCK_COUNT];
int g_count = 0;
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPreInstance,LPSTR IpCmdLine,int nShowCmd)
{
WNDCLASSEX wc;
wc.cbClsExtra = 0;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbWndExtra =0;
wc.hbrBackground = NULL;
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.hIconSm = NULL;
wc.hInstance = hinstance;
wc.lpfnWndProc = WinBackProc;
wc.lpszClassName = "我的窗口";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW|CS_VREDRAW;
RegisterClassEx(&wc);
HWND hwndw = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,"我的窗口","我的子窗口", WS_OVERLAPPEDWINDOW,200,200,600,400,NULL,NULL, hinstance, WinBackProc);
if (NULL== hwndw)
{
return 0;
}
ShowWindow(hwndw,nShowCmd);
UpdateWindow(hwndw);
WORD wdVersion = MAKEWORD(2, 2);
WSADATA wdScokMsg;
int nRes = WSAStartup(wdVersion, &wdScokMsg);
if (0 != nRes)
{
switch (nRes)
{
case WSASYSNOTREADY:
printf("重启计算机!");
break;
case WSAEINPROGRESS:
printf("更新网络库!");
break;
}
return 0;
}
SOCKET socketServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == socketServer)
{
int a = WSAGetLastError();
WSACleanup();
return 0;
}
if (2 != HIBYTE(wdScokMsg.wVersion) || LOBYTE(wdScokMsg.wVersion) != 2)
{
WSACleanup();
return 0;
}
struct sockaddr_in si;
si.sin_family = AF_INET;
si.sin_port = htons(12345);
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
int res = bind(socketServer, (const struct sockaddr*) & si, sizeof(si));
if (SOCKET_ERROR == res)
{
int a = WSAGetLastError();
closesocket(socketServer);
WSACleanup();
return 0;
}
if (SOCKET_ERROR == listen(socketServer, SOMAXCONN))
{
int a = WSAGetLastError();
closesocket(socketServer);
WSACleanup();
return 0;
}
if(SOCKET_ERROR == WSAAsyncSelect(socketServer, hwndw, UM_ASYNCSELECTMSG, FD_ACCEPT))
{
int a = WSAGetLastError();
closesocket(socketServer);
WSACleanup();
return 0;
}
g_sockALL[g_count] = socketServer;
g_count++;
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessageA(&msg);
}
for (int i=0;i<g_count;i++)
{
closesocket(g_sockALL[i]);
}
return 0;
}
int x = 0;
LRESULT CALLBACK WinBackProc(HWND hwndw,UINT msgID,WPARAM wparam,LPARAM lparam)
{
HDC hdc = GetDC(hwndw);
switch (msgID)
{
case UM_ASYNCSELECTMSG:
{
SOCKET sock = (SOCKET)wparam;
if (0 != HIWORD(lparam))
{
break;
}
switch (LOWORD(lparam))
{
case FD_ACCEPT:
{
TextOut(hdc,0,x,"accept",strlen("accept"));
x += 15;
SOCKET socketClient = accept(sock, NULL, NULL);
if (INVALID_SOCKET==socketClient)
{
int a = WSAGetLastError();
break;
}
if (SOCKET_ERROR == WSAAsyncSelect(socketClient, hwndw, UM_ASYNCSELECTMSG, FD_READ| FD_WRITE|FD_CLOSE))
{
int a = WSAGetLastError();
closesocket(socketClient);
break;
}
g_sockALL[g_count] = socketClient;
g_count++;
}
break;
case FD_READ:
{
TextOut(hdc, 0, x, "read", strlen("read"));
char str[1024] = { 0 };
if (SOCKET_ERROR == recv(sock, str, 1023, 0))
{
break;
}
TextOut(hdc, 30, x, str, strlen(str));
x += 15;
}
break;
case FD_WRITE:
TextOut(hdc, 0, x, "write", strlen("write"));
x += 15;
break;
case FD_CLOSE:
WSAAsyncSelect(sock,hwndw,0,0);
closesocket(sock);
for (int i=0;i<g_count;i++)
{
if (sock==g_sockALL[i])
{
g_sockALL[i] = g_sockALL[g_count - 1];
g_count--;
break;
}
}
break;
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
ReleaseDC(hwndw,hdc);
return DefWindowProc(hwndw,msgID,wparam,lparam);
}