#include
#define port 5150 # Define data_bufsize 8192
typedef struct _SOCKET_INFORMATION {BOOL RecvPosted; CHAR Buffer [DATA_BUFSIZE]; WSABUF DataBuf; SOCKET Socket; DWORD BytesSEND; DWORD BytesRECV; struct _SOCKET_INFORMATION * Next;} SOCKET_INFORMATION, * LPSOCKET_INFORMATION;
// # Define WM_Socket (WM_USER 1) #define wm_socket 1001
Void CreatesocketInformation (socket s); lpsocket_information getSocketinformation (socket s); Void FreesocketInformation (socket s);
HWnd MakeWorkerWindow (Void); LRESULT CALLBACK WINDOWPROC (HWND HWND, UINT SMSG, WPARAM WPARAM, LPARAM LPARAM);
LPSocket_information socketinfolist;
Void main (void) {msg msg; dword ret; socket listen; sockaddr_in internetdr; hwnddr_in internetdr; hwnd window; wsadata wsadata
IF ((Window = MakeWorkerWindow ()) == NULL) Return; IF ((Ret = WsaStartup (MakeWord (2, 2), & WSADATA))! = 0) {Printf ("WsaStartuu Faled Witf Error% D / N", RET); RETURN;} // IF ((listen = socket (sock_stream, 0)) == invalid_socket; listen = socket (AF_INET, SOCK_STREAM, 0); if (listen == Socket_ERROR) {Printf ("Socket () failed with error% d / n ", wsagetlasterror ()); return;}
WSAAsyncSelect (Listen, Window, WM_SOCKET, FD_ACCEPT | FD_CLOSE); InternetAddr.sin_family = AF_INET; InternetAddr.sin_addr.s_addr = htonl (INADDR_ANY); InternetAddr.sin_port = htons (PORT); // if (bind (Listen, (PSOCKADDR) & InternetAddr, sizeof (InternetAddr)) == SOCKET_ERROR) if (bind (Listen, (struct sockaddr *) & InternetAddr, sizeof (InternetAddr)) == SOCKET_ERROR) {printf ( "bind () failed with error% d / n", WSAGetLastError ());}}} F (Listen, 5)) {Printf ("Listen () failed with err% d / n", wsagetlasterror ()); return;} while (Ret = getMessage (& MSG, NULL, 0,0)) {IF (RET == -1) {Printf ("GetMessage () failed with error% d / n", getLastError ()); return;} TranslateMessage (& MSG); DispatchMessage (& MSG);
}
LRESULT CALLBACK WindowPro (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {SOCKET Accept; LPSOCKET_INFORMATION SocketInfo; DWORD RecvBytes, SendBytes; DWORD Flags; if (uMsg == WM_SOCKET) {if (WSAGETSELECTERROR (lParam)) {printf ( " Socket failed with error% d / n ", WSAGETSELECTERROR (lParam)); FreeSocketInformation (wParam);} else {switch (WSAGETSELECTERROR (lParam)) {case FD_ACCEPT: if ((Accept = accept (wParam, NULL, NULL)) = = INVALID_SOCKET) {printf ( "accept () failed with error% d / n", WSAGetLastError ()); break;} CreateSocketInformation (Accept); printf ( "Socket number% d connected / n", Accept); WSAAsyncSelect (Accept , hwnd, wm_socket, fd_read | fd_write | fd_close); Break;
case FD_READ: SocketInfo = GetSocketInformation (wParam); if (! SocketInfo-> BytesRECV = 0) {SocketInfo-> RecvPosted = TRUE; return 0;} else {SocketInfo-> DataBuf.buf = SocketInfo-> Buffer; SocketInfo-> DataBuf .len = DATA_BUFSIZE; Flags = 0; if (WSARecv (SocketInfo-> Socket, & (SocketInfo-> DataBuf), 1, & RecvBytes, & Flags, NULL, NULL) == SOCKET_ERROR) {if (! WSAGetLastError () = WSAEWOULDBLOCK) {printf ( "WSARecv () failed with error% d / n", WSAGetLastError ()); FreeSocketInformation (wParam); return 0;}} else {SocketInfo-> BytesRECV = RecvBytes;}} case FD_WRITE: SocketInfo = GetSocketInformation (wParam ); if (SocketInfo-> BytesRECV> SocketInfo-> BytesSEND) {SocketInfo-> DataBuf.buf = SocketInfo-> Buffer SocketInfo-> BytesSEND; SocketInfo-> DataBuf.len = SocketInfo-> BytesRECV - SocketInfo-> BytesSEND; if (Wsasend (Socket) Info-> Socket, & (SocketInfo-> Database, 1, & Sendbytes, 0, Null, NULL) == Socket_ERROR) {IF (Wsagetlasterror ()! = Wsaewouldblock) {Printf ("wsasend () failed with error% D / n ", WSAGetLastError ()); FreeSocketInformation (wParam); return 0;}} else {SocketInfo-> BytesSEND = SendBytes;}} if (SocketInfo-> BytesSEND == SocketInfo-> BytesRECV) {SocketInfo-> BytesSEND = 0 SocketInfo-> BytesRecv = 0; if (socketinfo-> recvosted ==
TRUE) {SocketInfo-> RecvPosted = FALSE; PostMessage (hwnd, WM_SOCKET, wParam, FD_READ);}} break; case FD_CLOSE: printf ( "Closing socket% d / n", wParam); FreeSocketInformation (wParam); break;} } return 0;} return DefWindowProc (hwnd, uMsg, wParam, lParam);} void CreateSocketInformation (SOCKET s) {LPSOCKET_INFORMATION SI; if ((SI = (LPSOCKET_INFORMATION) GlobalAlloc (GPTR, sizeof (SOCKET_INFORMATION))) == NULL) {Printf ("GlobalLoc () Failed with Error% D / N", getLastError ()); Return;}
Si-> Socket = S; Si-> Recvposted = false; si-> bytessend = 0; si-> bytesRecv = 0; si-> next = socketinfolist; socketinfolist = si;}
LPSocket_information GetSocketInformation (Socket S) {socket_information * Si = SocketInfolist; while (si) {if (Si-> Socket == s) Return Si; Si = Si-> Next;} return null;}
void FreeSocketInformation (SOCKET s) {SOCKET_INFORMATION * SI = SocketinfoList; SOCKET_INFORMATION * PrevSI = NULL; while (SI) {if (SI-> Socket == s) {if (PrevSI) PrevSI-> Next = SI-> Next; else SocketInfolist = Si-> Next; CloseSocket; GlobalFree (Si); Return;} prevsi = Si; si = Si-> next;}}
HWnd makeworkerwindow (void) {WNDCLASS WNDCLASS; char * providelclass = "asyncselect"; hwnd window;
wndclass.style = CS_HREDRAW; wndclass.lpfnWndProc = (WNDPROC) WindowPro; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = NULL; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor ( NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = providerClass; if (RegisterClass (& wndclass) == 0) {printf ( "RegisterClass () failed with error% D / N ", getLastError ()); Return Null;}
if ((Window = CreateWindow (ProviderClass, "", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL)) == NULL) {printf ( "CreateWindow () failed with error% d / n" GetLastError ()); return null;} returnof;}