关于SOCKET线程池,多个线程可否对同一个套接字同时写操作等问题?
最近在做一个服务器端的程序,遇到一系列的问题,请各位指导
开发环境:win2000,VC6,网络环境:通过互联网进行连接
开发思路:采用winsock1.1,及多线程的并发服务器,每个连接上来时,产生一个线程与其进行通信
1.多个线程可否对同一个套接字进行写操作,例如有一个SOCKET s;两个线程同时向s中写入内容,其中
一个写入为"12",而另一个写入内容为"34",在客户端接收的数据中有没有可能结果为"13","24"???
即收到的内容发生错乱???如果错乱则说明操作系统在发送时没有进行同步,此时在发送时我就要自
己进行同步了(背景是子线程负责与s进行通信,但主线程在某个时刻可能也需要向s发送一条通知消息)
2.关于线程池的问题:小弟线对程池思想基本有所了解,我先讲一下我的思路,采用线程预分配技术,
如首先预分配10个子线程等待连接,并且建立一个链表,该链表存放accept后返回的与客户端对等的套
接字,在对该链表进行添加,删除操作的时候需要用互斥体进行同步,负责处理accept请求的线程向该
链表中添加套接字节点,同时向等待的线程发送事件通知,要求其从链表中读取可用的套接字,并且为
之提供服务。当子线程负责的套接字断开时,该子线程被挂起,等待事件通知。但问题是,如果有许多
子线程,那企不是要创建很多个事件对象,会不会导致服务器性能上出现下降。
3.发送大的数据包的问题:当客户端登录后,会向服务器发送清求要求返回所有客户信息,而客户信息则
为一个结构,一般情况当单个客户信息填满后,可能有300个byte左右,在这种情况下,我应该如何组织
客户信息包呢,是每个数据包中只包含一个客户信息呢,还是每个数据包中包含10条客户信息包呢,还
是更多呢????我个人的意思是,由于TCP是基于流的协议,本身就是没有边界的,所以数据包是尽量
大些为好,可以提高每次发送的效率,如send一次发送5K左右,大概18个左右的客户信息结构(300 * 17
),这样做是否合适????
4.最后一个问题比较低级,是个客户端编程的问题:举例来说,就是客户端有多个类型的对话框都包含
同一个相同的请求(当然同一个对话框中可能有多个不同类型的请求),如用户登录后,可能会打开某个
对话框,该对话框中有一个列表框,和一个“获取客户信息”的按钮,当用户点击此按钮时,需要向服
务器发送请求获取所有客户信息,然后要在列表框中显示出来,而问题是,当用户请求的数据返回时,
我如何根据这条返回的消息找到相应显示这个数据包内容的窗口,他们之间应该如何建立关连???并
且数据返回时,该对话框窗口可能已经关闭了.