Click here to Skip to main content
15,901,853 members

Comments by GeorgeZv (Top 9 by date)

GeorgeZv 10-May-17 17:30pm View    
I've modified my question and stacked with a problem, found where it is using debug but still can't solve it.
GeorgeZv 27-Apr-17 17:04pm View    
Thanks again for your attention.
I was asked to create this list with pushBack function. Here is a new question: https://www.codeproject.com/Questions/1184365/Multiplexing-I-O-client-server-message-exchange
GeorgeZv 27-Apr-17 16:17pm View    
Thank you! I found this article very useful
GeorgeZv 25-Apr-17 16:27pm View    
oops, it seems it's not enough space for my code, I "improved" my question.
GeorgeZv 25-Apr-17 16:26pm View    
Sorry for a long pause, I was away during long weekends.
First of all, thank you for all your reponses.
When I tried to close SocketDescriptor my client stopped working completely. I rewrote a little bit my server, could you check it, please? I still have problems with repeated message and I have error code in client-output (10054, can't fix it).

And I also wrote a structure client and pushBack function to add my new connected clients to the list but not sure if it works fine. It seems I add smth wrong there in while(1) cycle.

#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