首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于SOCKET编程的几个小问题

2012-03-17 
关于SOCKET编程的几个问题最近在做一个基于SOCKET的聊天室,考虑到连接方面的问题,我觉得用TCP好点。现在有

关于SOCKET编程的几个问题
最近在做一个基于SOCKET的聊天室,考虑到连接方面的问题,我觉得用TCP好点。
现在有几个问题很迷茫:
1.在SOCKET中,以下哪些函数默认是阻塞的?
listen() , accept() , send() , recv() , sendto() , recvfrom() 

2.所谓的阻塞,到底是怎么回事?

之所以这么问,是因为在调试代码的时候,调用listen()函数后,后面的代码仍然继续执行,直到accept()前停住。但书上说的是listen()函数默认是阻塞的。

3.使用多线程的话,我的想法是:
在主线程中初始化、绑定一个套接字,然后将这个套接字传给监听线程使其监听,并执行接受(假如接受的是客户端A)操作获得一个新的套接字。此时服务器可以使用新的套接字和客户端A进行通信,进行发送/接受信息的操作。
但这样的话,该线程只能和客户端A通信,如果现在客户端B也发来连接请求,使用该线程可以监听到并能接受客户端B,如何使服务器同时能和A、B通信呢?(如果仅使用一个监听线程的话)
由于在一个线程中暂时无法实现(个人能力有限- -!),我使用两个线程来监听,这样实现了服务器同时和A、B通信的目的。
现在的问题是,这种做法可取么?我的机器是XP系统,2G内存,算是比较老的配置了。如果每个与客户端的连接都用一个单独的线程来管理的话,假如现在有50个客户端,那我这机器受得了么?


[解决办法]
1 accept() , send() , recv() , sendto() , recvfrom() 模糊记得.

2 socket阻塞就是函数去系统缓冲区尝试读取数据,没有就一直在那里等.


3 所以有很多socket模型. select epoll iocp.
[解决办法]
socket接口分为3类:
第一类是socket函数。这类函数分两部分。第一部分是用于网络I/O的函数,如

accept、Closesocket、connect、recv、recvfrom、Select、Send、Sendto

另一部分是不涉及网络I/O、在本地端完成的函数,如

bind、getpeername、getsockname、getsocketopt、htonl、htons、inet_addr、inet_nton

ioctlsocket、listen、ntohl、ntohs、setsocketopt、shutdow、socket等

第二类是检索有关域名、通信服务和协议等Internet信息的数据库函数,如

gethostbyaddr、gethostbyname、gethostname、getprotolbyname

getprotolbynumber、getserverbyname、getservbyport。

第三类是Berkekley socket例程的Windows专用的扩展函数,如gethostbyname对应的WSAAsynGetHostByName(其他数据库函数除了gethostname都有异步版本),select对应的WSAAsynSelect,判断是否阻塞的函数WSAIsBlocking,得到上一次Windsock API错误信息的WSAGetLastError,等等。

从另外一个角度,这些函数又可以分为两类,一是阻塞函数,一是非阻塞函数。所谓阻塞函数,是指其完成指定的任务之前不允许程序调用另一个函数,在Windows下还会阻塞本线程消息的发送。所谓非阻塞函数,是指操作启动之后,如果可以立即得到结果就返回结果,否则返回表示结果需要等待的错误信息,不等待任务完成函数就返回。

首先,异步函数是非阻塞函数;

其次,获取远地信息的数据库函数是阻塞函数(因此,WinSock提供了其异步版本);

在Berkeley socket函数部分中,不涉及网络I/O、本地端工作的函数是非阻塞函数;

在Berkeley socket函数部分中,网络I/O的函数是可阻塞函数,也就是它们可以阻塞执行,也可以不阻塞执行。这些函数都使用了一个socket,如果它们使用的socket是阻塞的,则这些函数是阻塞函数;如果它们使用的socket是非阻塞的,则这些函数是非阻塞函数。

创建一个socket时,可以指定它是否阻塞。在缺省情况下,Berkerley的Socket函数和WinSock都创建“阻塞”的socket。阻塞socket通过使用select函数或者WSAAsynSelect函数在指定操作下变成非阻塞的。

1、accept() , send() , recv() , sendto() , recvfrom()
默认是阻塞的,listen不是阻塞的;

2、关于是否是阻塞,上面已经讲了;
3、用多少个线程去处理多少个客户端请求这个要看服务器的;
楼上也说了对应的模型,LZ可以参考

[解决办法]
参考:

http://blog.csdn.net/lspo816/article/details/663554
[解决办法]
楼主去看看《windows核心编程》
[解决办法]
起一个监听线程、有连接来的时候 用该套接字起一个接受线程接受该客户端数据、并将该套接字及一定的信息记录到一个列表中方便查询获取、聊天室一般是C/S架构、你可以在服务器端为各客户端做数据转发

热点排行