int main(int argc, char* argv[]) { while (!initSock()); SOCKET sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockServer == INVALID_SOCKET) { clearSock(sockServer); return -1; } sockaddr_in serverAddr = { 0 }; serverAddr.sin_family = AF_INET; serverAddr.sin_addr.S_un.S_addr = INADDR_ANY; serverAddr.sin_port = htons(PORT); if (bind(sockServer, (sockaddr*)&serverAddr, sizeof(sockaddr))) { clearSock(sockServer); return -1; } WSAEVENT listenEvent = WSACreateEvent(); long eventType = FD_ACCEPT | FD_CLOSE; WSAEventSelect(sockServer, listenEvent, eventType); printf("******************************************************************************\n"); printf("**********welcome to use the high-big-up server built by lancelot************"); printf("********************************************************************************\n"); printf("\nwaiting...\n"); if (listen(sockServer, SOMAXCONN) == SOCKET_ERROR) { clearSock(sockServer); printf("\n bye-bye \n"); return -1; } arrSocket[g_total] = sockServer; arrEvent[g_total++] = listenEvent; char buf[1024] = { 0 }; SOCKET sockClient = INVALID_SOCKET; WSANETWORKEVENTS netWorkEvent = { 0 }; long clientEventType = FD_CLOSE | FD_READ | FD_WRITE; while (true) { g_index = WSAWaitForMultipleEvents(g_total, arrEvent, false, 100, false); if (g_index == WSA_WAIT_TIMEOUT) continue; WSAEnumNetworkEvents(arrSocket[g_index - WSA_WAIT_EVENT_0], arrEvent[g_index - WSA_WAIT_EVENT_0], &netWorkEvent); if(!eventFunc(netWorkEvent, sockClient, buf, clientEventType)) continue; printf("get a message!\n"); } if (sockServer != INVALID_SOCKET) closesocket(sockServer); WSACleanup(); return 0; }
static int rwrite(int sock, struct LSFHeader *hdr) { static char fname[] = "rwrite()"; struct rrdwrReq req; char msgBuf[LSRCP_MSGSIZE]; XDR xdrs; char *buf; xdrmem_create(&xdrs, msgBuf, LSRCP_MSGSIZE, XDR_DECODE); if (readDecodeMsg_(sock, msgBuf, hdr, SOCK_READ_FIX, &xdrs, (char *) &req, xdr_rrdwrReq, NULL)) { ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDeocdeMsg_"); xdr_destroy(&xdrs); close(sock); return -1; } xdr_destroy(&xdrs); if ((buf = (char *) malloc(req.len)) == NULL) { if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, msgBuf, sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) { ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_"); close(sock); } clearSock(sock, req.len); return 0; } if (SOCK_READ_FIX(sock, buf, req.len) != req.len) { ls_errlog(stderr, I18N_FUNC_D_FAIL_M, fname, "SOCK_READ_FIX", req.len); goto fail; } if ((req.len = write(req.fd, buf, req.len)) < 0) { goto fail; } free(buf); if (lsSendMsg_(sock, 0, req.len, NULL, msgBuf, sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) { ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_"); close(sock); return -1; } return 0; fail: free(buf); if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, msgBuf, sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) { ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_"); close(sock); return -1; } return 0; }