#pragma comment(lib, "ws2_32.lib") #define _WINSOCK_DEPRECATED_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #include <winsock2.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> //#include "list.h" #define PRINTUSERS if (nclients)\ printf("We have %d user online\n", nclients);\ else printf("No users online\n***************\n"); #define PORT 3765 #define BACKLOG 10 #define MAXDATASIZE 1024 #define MAXUSERSONLINE 64 struct client { int numClient; struct client* next; }; void print(struct client* head); int pushBack(struct client** head, int numClient); int checkSockOpt(int socket); int main(int argc, char* argv[]) { struct sockaddr_in serverAddr; struct sockaddr_in clientAddr; SOCKET socketDescriptor; fd_set readSocketDescriptor; fd_set writeSocketDescriptor; int newSocketDescriptor; WSADATA wsaData; WORD wsaStart; timeval tv; // LIST TEST #1 struct client* head = 0; pushBack(&head, 111); pushBack(&head, 222); pushBack(&head, 999); print(head); // int retVal; int clientAddrSize = sizeof(clientAddr); char bufferData[MAXDATASIZE] = { 0 }; int nclients = 0; int numBytes = 0; if (argc > 1) { printf("Uses: <chatserver>\n"); return -1; } do { if ((wsaStart = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0) { printf("WSAStartup error "); break; } if ((socketDescriptor = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("Socket error "); closesocket(socketDescriptor); break; } serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = INADDR_ANY; if (bind(socketDescriptor, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("Bind error "); closesocket(socketDescriptor); break; } if (listen(socketDescriptor, BACKLOG) == SOCKET_ERROR) { printf("Listening error "); closesocket(socketDescriptor); break; } while (1) { FD_ZERO(&readSocketDescriptor); FD_ZERO(&writeSocketDescriptor); FD_SET(socketDescriptor, &readSocketDescriptor); FD_SET(socketDescriptor, &writeSocketDescriptor); printf("Setup SERVER socket descriptor number: %d\n", socketDescriptor); tv.tv_sec = 5; // Do not forget to put after WHILE(1) if ((retVal = select(socketDescriptor + 1, &readSocketDescriptor, &writeSocketDescriptor, NULL, &tv)) == SOCKET_ERROR) { printf("Select error "); break; } if ((FD_ISSET(socketDescriptor, &readSocketDescriptor)) != 0) { printf("CHECK FD_ISSET value #1: %d\n", FD_ISSET(socketDescriptor, &readSocketDescriptor)); //int clientList[MAXUSERSONLINE] = { 0 }; //for (int i = 0; i <= MAXUSERSONLINE; i++) //{ if ((newSocketDescriptor = accept(socketDescriptor, (struct sockaddr *)&clientAddr, &clientAddrSize)) == SOCKET_ERROR) { printf("Accept error "); break; } // newSocketDescriptor = clientList[i]; struct client* head = 0; pushBack(&head, newSocketDescriptor); print(head); // nclients++; PRINTUSERS printf("Server got connection from %s\n", inet_ntoa(clientAddr.sin_addr)); FD_SET(newSocketDescriptor, &readSocketDescriptor); //FD_CLR(socketDescriptor, &readSocketDes
Setup socket descriptor number: 120 Socket value after "Select": 120 CHECK FD_ISSET value #1: 1 We have 1 user online Server got connection from 127.0.0.1 CHECK FD_ISSET value #2: 1 Checking now newSocketDescriptor = 120, readfs(j) status = 1 SockOpt Value: 0. Error code: 0 Checking now newSocketDescriptor = 120, readSocketDescriptor status = 1 Recv: retVal = 1, bufferData = Hello, world! Hello, world! Hello, world! Hello, world! No users online *************** CHECK FD_ISSET value #1: 1
Send function - OK Received text: Hello, world! Send function - OK Received text: Hello, world! Send function - OK Received text: Hello, world! Send function - OK Received text: Hello, world! Send function - OK Received text: Hello, world! Send function - OK Received text: Hello, world!