怎样才能设计一个产品化的,强壮和高效率的Socket服务器程序,求教资深程序员

yinyu 2000-06-14 12:01:00
感谢您关注这个问题
Socket程序按照资料,依样画葫芦,大家都能写出来。
可是怎样才能保证Socket服务器容错性强,重负荷、网络性能不佳的条件下仍能有条不紊的处理信息,有关资料很少,希望有经验的程序员能谈谈您的体会。
恳请不要泛泛而谈,你们都知道程序员最想知道什么对吗

拜谢
...全文
403 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
NEOS 2001-07-13
  • 打赏
  • 举报
回复
/* WINSOCK.H--definitions to be used with the WINSOCK.DLL
#ifndef FD_SETSIZE
#define FD_SETSIZE 64
#endif /* FD_SETSIZE */

typedef struct fd_set {
u_int fd_count; /* how many are SET? */
SOCKET fd_array[FD_SETSIZE]; /* an array of SOCKETs */
} fd_set;

#define FD_SETSIZE 64
就是限制,但确切的数目可能与64不一样

这是msdn中的一篇文章

Maximum number of sockets supported

The maximum number of sockets supported by a particular Windows Sockets service provider is implementation specific. An application should make no assumptions about the availability of a certain number of sockets. For more information on this topic see WSAStartup.

The maximum number of sockets that an application can actually use is independent of the number of sockets supported by a particular implementation. The maximum number of sockets that a Windows Sockets application can use is determined at compile time by the manifest constant FD_SETSIZE. This value is used in constructing the fd_set structures used in select. The default value in WINSOCK2.H is 64. If an application is designed to be capable of working with more than 64 sockets, the implementor should define the manifest FD_SETSIZE in every source file before including WINSOCK2.H. One way of doing this may be to include the definition within the compiler options in the makefile. For example, you could add "-DFD_SETSIZE=128" as an option to the compiler command line for Microsoft C. It must be emphasized that defining FD_SETSIZE as a particular value has no effect on the actual number of sockets provided by a Windows Sockets service provider.



oldnew 2001-07-13
  • 打赏
  • 举报
回复
windows下没有限制连接的数目吧,只是限制了一下同时Accept的socket,也就是Listen()的一个参数,缺省是5,

一个socket要耗掉一定的内存,我写过的一个垃圾程序到200个的时候就顶不住了,早泄!

据说同等条件下C++写的比Java写的能 容纳的数目是不一样的...

你问哪个多?废话,当然是C++的多了。
meifen 2001-07-13
  • 打赏
  • 举报
回复
4
shaw 2000-10-31
  • 打赏
  • 举报
回复
还有,windows下是否限制socket连接的数目?如果是,有多大?如何改变?
kylewu 2000-10-28
  • 打赏
  • 举报
回复
你的意思应该是想服务器和客户端采用persistent connection的方式连接吧。
这样的话,服务器和客户端建立一个具有确认/重发协议的通讯规程就行了。
不过其实大多数的系统都是遇到出错就断开连接的,很多商业数据库系统也是如此,但也不见得很影响效率。
sxbyl 2000-10-28
  • 打赏
  • 举报
回复
关注!
softarts 2000-10-28
  • 打赏
  • 举报
回复
在windows下,采用线程池(completion port)系统会自动调整和激活线程
unix下,象apache那样,保持一定数量的进程监听,并且能够根据访问量提高降低监听的
进程个数
scklotz 2000-10-28
  • 打赏
  • 举报
回复
关注
LiXin 2000-10-28
  • 打赏
  • 举报
回复
attention
shaw 2000-10-28
  • 打赏
  • 举报
回复
listen
dirotac 2000-10-27
  • 打赏
  • 举报
回复
harley 2000-06-17
  • 打赏
  • 举报
回复
我不知道你的平台是什么呀?windows 和unix 在处理这些时的原理是不
同的.你可不可以告诉我你的平台.
茂奇软件 2000-06-16
  • 打赏
  • 举报
回复
listen!
pipu 2000-06-16
  • 打赏
  • 举报
回复
我怎经写过一个socket server就目前看来在500用户同时使用应该没问题。
就是运行在一台sun sparc机器。
有兴趣可以交流。
yinyu 2000-06-16
  • 打赏
  • 举报
回复
pipu,谢谢你的热心
前几天我就把你的e-mail放到我的通讯录里,准备向你请教关于COM的问题,没想到你热情的伸出了手。
我的主要问题是,作为服务器端,一旦与客户端建立了连接,那么它应该具有这样的能力:客户端由于程序编制错误、网络环境不佳,甚至恶意的破坏,可能会发出一些杂乱的无意义数据,如果服务器收到自己无法解释的数据就断开连接,那么客户端不得不重新建立连接,这个开销是很大的。
我现在的做法是,如果数据流长度与数据头中说明不一致,仍然将其全部收回来(姑且称为数据清理)然后继续监听客户端下一次服务请求,这样做有几个不自然之处(也许是我实现不当)
1。清理中用select函数询问端口是否还有数据,这个过程需要几十毫秒的延迟
2。这个过程中假定客户端会等待服务器端清理完毕后才会发送下一次服务请求,如果服务器还为清理完毕,客户端又发送请求,服务器端就会将其作为垃圾数据清理掉。而在重负荷应用环境下,这样会影响性能。

望指点
claywang 2000-06-16
  • 打赏
  • 举报
回复
我也编过Winsocket的程序,深有同感,
编出来不难,但编一个结构精良的就不
是那么简单的了。
dolaime 2000-06-15
  • 打赏
  • 举报
回复
pay attention
jy90 2000-06-14
  • 打赏
  • 举报
回复
listen!
jy90 2000-06-14
  • 打赏
  • 举报
回复
LISTEN!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧