TCP 多线程问题 一个服务端对多个客户端

时间:2021-04-29 22:15:44
昨天自己做了一个小的聊天室程序,基本思想是这样:
主线程中新建两个子线程 Recv和Accept 用来接收客户端数据和接受客户端连接请求,然后在Accept线程函数里面在创建线程Send 用来向指定客户端发送数据(这里的Send线程是循环创建的,有客户端连进来,就创建一个Send线程用来向该客户端发送数据)
那么问题来了:服务端程序我写好之后没有改过,但是当我打开客户端之后有三种情况:
1,客户端能接收数据,能发送数据,但是服务端只能接收数据,不能发送数据(创建发送数据线程的代码执行不到)
2,客户端能接收数据,能发送数据,但是服务端只能发送数据,不能接收数据(接收线程的代码执行不到)
3,客户端能接收数据,能发送数据,服务端能接收数据,能发送数据。(正常的)
 我开启服务端之后,然后打开客户端出现上述三种情况的一种(概率性事件,没有规律的出现)。关闭客户端再打开客户端出现另一种情况或者还是以前的情况,再关闭客户端在打开客户端仍然是概率性出现三种情况之一。 
  这个是因为线程冲突的问题吗?
我要让我的程序稳定出现第三种情况,该怎么改?

第二个问题     定义一个结构体用来存储客户端的所有信息,每一个结构体对象代表一个客户端。如何定义一个模板来生成对象,然后再用数组来存储对象,就是每当我有一个客户端连进来的时候,自动生成一个结构体对象,然后通过对象数组下标来访问结构体对象信息。(就是其实对象名字不重要,我可以不知道对象名字(系统自动创建名字),但是我需要让系统自动创建这个一个对象用来访问它的信息。)这个是应该怎么做到,最好有代码解释下

5 个解决方案

#1


http://download.csdn.net/detail/amoyman/9505030
我用MFC写的一个模型,没有出现你说的这些问题

#2


引用 1 楼 amoyman 的回复:
http://download.csdn.net/detail/amoyman/9505030
我用MFC写的一个模型,没有出现你说的这些问题
 
 你用异步写的吧。用MFC基于消息的异步套接字是不会出现这种情况,因为基于消息的操作这个比我现在做的这个要精确很多。这个是很好的办法,但是我不太会MFC 异步,基于消息的异步机制不太了解,我没有基于消息,也没有设置异步,就是简单的创建线程,然后到线程函数里面去做我想做的事,其他的都交给CPU自己决定了,没有设置同步跟异步。

#3


你服务端可以使用非阻塞IO模式。
你可以使用多线程,一个线程维护一个客户端,如果客户端数目不多的话。

#4


引用 3 楼 VisualEleven 的回复:
你服务端可以使用非阻塞IO模式。
你可以使用多线程,一个线程维护一个客户端,如果客户端数目不多的话。

正是这么做的啊,一个线程维护一个客户端,如果我不设置非阻塞模式,是不是输出就会有问题?

#5


自己管理线程需要做很多事。既然 MFC 做了线程管理的大部分工作,就放心使用异步套接字,省心啊。

#1


http://download.csdn.net/detail/amoyman/9505030
我用MFC写的一个模型,没有出现你说的这些问题

#2


引用 1 楼 amoyman 的回复:
http://download.csdn.net/detail/amoyman/9505030
我用MFC写的一个模型,没有出现你说的这些问题
 
 你用异步写的吧。用MFC基于消息的异步套接字是不会出现这种情况,因为基于消息的操作这个比我现在做的这个要精确很多。这个是很好的办法,但是我不太会MFC 异步,基于消息的异步机制不太了解,我没有基于消息,也没有设置异步,就是简单的创建线程,然后到线程函数里面去做我想做的事,其他的都交给CPU自己决定了,没有设置同步跟异步。

#3


你服务端可以使用非阻塞IO模式。
你可以使用多线程,一个线程维护一个客户端,如果客户端数目不多的话。

#4


引用 3 楼 VisualEleven 的回复:
你服务端可以使用非阻塞IO模式。
你可以使用多线程,一个线程维护一个客户端,如果客户端数目不多的话。

正是这么做的啊,一个线程维护一个客户端,如果我不设置非阻塞模式,是不是输出就会有问题?

#5


自己管理线程需要做很多事。既然 MFC 做了线程管理的大部分工作,就放心使用异步套接字,省心啊。