Should I Use Multi-threading to Solve This Coding Problem - Client/Server in C++

I'm trying to write remote file manager access in C++ under Windows. It is a client-server based on command line interface. Right now, i did not do anything related to multi-threading.

The remote file manager is based on regular or reverse connection mode. I'm working on reverse mode.

My problem is: (NOTE: i made it long just to make my point clear. The idea is not complex)

Every time my remote pc's connects to the client, i want those remote hosts name get stored in an Arraylist(vector) that keeps track of online hosts that are connected to the client currently. If i want to interact with one of my online hosts, i just choose the host name and then i start dealing with that remote pc. The interaction is a file manager, upload, download, rename, delete files.

Right now, when i get three pc's in my internal network wants to connect to the client at the same time. They get placed in on a queue, and then connections are accepted respectively. For example, if i have three pc's wants to connect to the client. The client will take the first connection and establish it and then i'm tied to this connection until it is disconnected. After that, the client will accept the second connection on the queue and interact with it until disconnection happens and so on. What i want to do is the following:

I accept the first connection and put it in an "online hosts" list, and then move to the second connection and put in the online hosts list, and so on. Moreover, when i want to interact with one of the online hosts, i just go to the list and pick the name, then i can get implement file manager on that chosen remote pc. Can i do this in single threaded mode? If yes, how?

In other words, can't i make listen() and accept() takes connections concurrently, but the interaction between the client and the remote server is based on single thread. listen() listens for connections, accept() takes all the connections, client interacts with certain connection only when needed. The interaction happens once at a time, i mean once client interacting with internal-pc1, then nothing else can happen until client user chooses different internal-pc number. So accepting connections are concurrent, but interaction only happens only with one remote pc at a time. Even with this remote pc, client only can handle one feature at a time, such as file manager, nothing else, until file manager duty ends then client can choose another feature such as process manager. Does this require me to make both sides multi-threaded? I'm trying to avoid changing my whole code from single threaded to multi threaded...


Note: what i'm facing right now is: when client gets a connection from a local remote host, the connection is established and client get tied with this connection until disconnection occurs. After that, second connection in the queue is taken and so on.

I hope my question is clear enough
its clear.. but a little long.. anyway..

The client will take the first connection and establish it and then i'm tied to this connection until it is disconnected. After that, the client will accept the second connection on the queue and interact with it until disconnection happens and so on


you cannot do this in a single thread.. infact what you want is not achievable in single thread. See your server is connecting to many clients at a time and want to service them. some days back i gave the same solution to kevinchkin. let me put that here again and you might get some help after seeing that.:

here you go...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//this thread will keep on accepting new connections forever..
//keep accepting connections

void some_function()
{
	while(1)

	{

		ClientSocket = accept(ServerSocket,NULL,NULL);

		if (ClientSocket == INVALID_SOCKET)

		{

			ShowMessage(_T("Invalid Socket"));

			return;

		}		

		

		//hThread = _beginthread(RecvThread,0,(void *)ClientSocket);

		hThread = _beginthreadex(NULL,0,RecvThread,(void *)ClientSocket,

					CREATE_SUSPENDED,&ThreadID);

		i = 0;

		while(g_treeclient[i].hTree != 0)

		{

			i++;

		}



		//for each thread started we save the client with which it is connected

		//the third parameter hTree will be updated when the a new tree is created.

		g_treeclient[i].ClientSocket = ClientSocket;

		ResumeThread((void*)hThread);



	}
}//some_function ends...


//this is threaded function which handles requests from the clients
//when the clients closes the while loops breaks and the thread will close.
//even if 100 clients are running, a break will keep on closing all the clients one by one.
//on closing the server i request all the clients to close themselves.
unsigned int __stdcall RecvThread(void *pParam)

{

	XINFO				xi;

	int				nRecv;

	SOCKET		ClientSocket;

	HWND			hParent;

	HWND			hDlg;

	



	//...some code



	ClientSocket = (SOCKET)pParam;


	//some code..


	SHGetSpecialFolderPath(GetFocus(),szPath,CSIDL_DESKTOPDIRECTORY,0);



	while(1)

	{	

		nRecv = recv(ClientSocket,(TCHAR*)&xi,sizeof(XINFO),0);

		switch(xi.infotype)

		{

			case ROOT:

			case CHILD:

				//update client socket info

				xi.SockInfo = ClientSocket;

				//ask parent to add node

				SendMessage(hParent,WM_MAKETREE,(WPARAM)&xi,0);

				break;



				//No interface interaction needed to make the file

				//so we can do everything here only.

			case FILEDATA_FINISH:

			case FILEDATA:

			{

				//some code

			}
			

			case ERROR_SENDING_DATA:

			{

				//some code...

			}

		}				



		//some code
	}

		

//	g_bRecvThreadWorking = FALSE;

	_endthreadex(0);

}

//just try to understand whats going on, may be this will give you some idea of your problem.  


just see whats going on here.. as soon as i get a accept request i create a thread and send the request to the thread.. so requests are handled concurrently and clients dont have to wait.. hope you will the basic idea.
GREAT .... I will re-look at the code. It will help me surely... Thanks
Topic archived. No new replies allowed.