Welcome

首页 / 软件开发 / .NET编程技术 / socket编程与线程模型五

socket编程与线程模型五2010-12-14 cnblogs worldreason2、socket地址

根据前面的分析,我们可以认为soket句柄和本地的绑定地址共同确定了协议 栈上的数据接收缓冲区或者read缓冲区。而协议栈上的写缓冲区或者发送是被公 用的(但是不同的协议无法公用,例如tcp和udp)。所以,对同一个地址,不同 的socket可以收到不同的内容。但是对一个socket上的地址绑扎,无论是显式还 是隐式,只能进行一次。

3、并发连接

如果客户端掉用connect进行连接请求,多个客户端可能存在并发请求。服务 器会把不能响应的请求缓存在listen()指定了大小的请求队列。这个时候被缓 存了请求的客户端connect()方法会正确返回,并继续执行。但是会在 send和 recv方法上被阻塞等待。

如果并发数目大于连接请求的缓冲区大小,那么不能被缓存的那些连接 connect()方法会返回(暂不清楚有没有返回错误)。但是在这个socket上调 用send或者recv方法,就会返回错误结果。

所以,如果连接请求的服务过程比较费时间,那么为了不至于被缓存请求的 客户端长时间等待和另一些客户端连接失败,一般需要采用多线程方式。因为把 服务交给子线程以后,主线程总有机会accept更多的请求。所以,除了把请求队 列设置大一些,多线程也是改善服务的方法。

4、connect()

connect()有一个作用,从面向连接的例子看就是把一个数据发送或者写入 地址帮顶到套接字上,从而使得该套接字绑定了两个地址。显式绑扎发送地址和 隐式绑扎接收地址。

无连接的协议也可以调用connect(),但是这种情况下connect()并不会 向服务器进行连接请求。这个时候就是把一个地址显示绑扎到某个套接字,使它 具备一个关联的数据发送地址。这样,无连接协议也可以使用send()和recv( )在这样一个套接字上写如和读取数据。虽然已经绑扎了一个默认的发送地址, 但是通过sendto()又可以把数据发送到非默认的地址。

bind()用来显式给一个socket绑扎一个数据读取地址,这是本地地址。客 户端不鼓励这种方式,而是采用隐式绑扎。但是如果显式绑扎了也不会错。