﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-It Smils-随笔分类-Net Programming</title><link>http://www.cppblog.com/ronliu/category/8749.html</link><description>思绪的自留地</description><language>zh-cn</language><lastBuildDate>Thu, 08 Jan 2009 20:13:08 GMT</lastBuildDate><pubDate>Thu, 08 Jan 2009 20:13:08 GMT</pubDate><ttl>60</ttl><item><title>socket编程之端口占用 及socket高级选项</title><link>http://www.cppblog.com/ronliu/archive/2009/01/06/71312.html</link><dc:creator>ronliu</dc:creator><author>ronliu</author><pubDate>Tue, 06 Jan 2009 03:52:00 GMT</pubDate><guid>http://www.cppblog.com/ronliu/archive/2009/01/06/71312.html</guid><wfw:comment>http://www.cppblog.com/ronliu/comments/71312.html</wfw:comment><comments>http://www.cppblog.com/ronliu/archive/2009/01/06/71312.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ronliu/comments/commentRss/71312.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ronliu/services/trackbacks/71312.html</trackback:ping><description><![CDATA[现象：服务器端意外退出后马上重启，提示端口绑定错误，端口正在使用中。稍等一会后再次重启，可以正常运行。<br>可以设置socket的选项为SO_REUSEADDR，使其允许完全重复的绑定。<br>&nbsp;&nbsp;&nbsp; int rc = 1;<br>&nbsp;&nbsp;&nbsp; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&amp;rc, sizeof(rc));<br>&nbsp;&nbsp;&nbsp; bind(fd, (struct sockaddr *) &amp;addr, sizeof(addr));<br><br>setsockopt的函数原型为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中optval为选项的开关标志符，例如我使用rc＝1开启SO_REUSEADDR。<br>
<br>fcntl 文件控制，file control，譬如控制socket为非阻塞IO，信号驱动IO等。类似的有ioctl<br> <img src ="http://www.cppblog.com/ronliu/aggbug/71312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ronliu/" target="_blank">ronliu</a> 2009-01-06 11:52 <a href="http://www.cppblog.com/ronliu/archive/2009/01/06/71312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通俗解释socket</title><link>http://www.cppblog.com/ronliu/archive/2008/10/26/65113.html</link><dc:creator>ronliu</dc:creator><author>ronliu</author><pubDate>Sun, 26 Oct 2008 09:09:00 GMT</pubDate><guid>http://www.cppblog.com/ronliu/archive/2008/10/26/65113.html</guid><wfw:comment>http://www.cppblog.com/ronliu/comments/65113.html</wfw:comment><comments>http://www.cppblog.com/ronliu/archive/2008/10/26/65113.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/ronliu/comments/commentRss/65113.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ronliu/services/trackbacks/65113.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; socket是网络编程的基础，本文用打电话来类比socket通信中建立TCP连接的过程。<br>&nbsp;&nbsp;&nbsp; socket函数，表示你买了或者借了一部手机。<br>&nbsp;&nbsp;&nbsp; bind函数，告诉别人你的手机号码，让他们给你打电话。<br>&nbsp;&nbsp;&nbsp; listen函数，打开手机的铃声，而不是静音，这样有电话时可以立马反应。listen函数的第二个参数，最大连接数，表示最多有几个人可以同时拨打你的号码。不过我们的手机，最多只能有一个人打进来，要不然就提示占线。<br>&nbsp;&nbsp;&nbsp; connect函数，你的朋友知道了你的号码，通过这个号码来联系你。在他等待你回应的时候，不能做其他事情，所以connect函数是阻塞的。<br>&nbsp;&nbsp;&nbsp; accept函数，你听到了电话铃声，接电话，accept it！然后&#8220;喂&#8221;一声，你的朋友听到你的回应，知道电话已经打进去了。至此，一个TCP连接建立了。<br>&nbsp;&nbsp;&nbsp; read/write函数，连接建立后，TCP的两端可以互相收发消息，这时候的连接是全双工的。对应打电话中的电话煲。<br>&nbsp;&nbsp;&nbsp; close函数，通话完毕，一方说&#8220;我挂了&#8221;，另一方回应"你挂吧"，然后将连接终止。实际的close(sockfd)有些不同，它不止是终止连接，还把手机也归还，不在占有这部手机，就当是公用电话吧。<br>&nbsp;&nbsp;&nbsp; 注意到，上述连接是阻塞的，你一次只能响应一个用户的连接请求，但在实际网络编程中，一个服务器服务于多个客户，上述方案也就行不通了，怎么办？想一想1860，移动的声讯服务台，也是只有一个号码，它怎么能同时服务那么多人呢？可以这样理解，在你打电话到1860时，总服务台会让一个接线员来为你服务，而它自己却继续监听有没有新的电话接入。在网络编程中，这个过程类似于fork一个子进程，建立实际的通信连接，而主进程继续监听。1860的接线员是有限的，所以当连接的人数达到上线时，它会放首歌给你听，忙等待，直到有新的空闲接线员为止。<br>&nbsp;&nbsp;&nbsp; 实际网络编程中，处理并发的方式还有select/poll/epoll等。<br><br>下面是一个实际的socket通信过程：<br><img alt="" src="http://www.cppblog.com/images/cppblog_com/ronliu/tcpsocket.png" width="554" height="327"><br><br> <img src ="http://www.cppblog.com/ronliu/aggbug/65113.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ronliu/" target="_blank">ronliu</a> 2008-10-26 17:09 <a href="http://www.cppblog.com/ronliu/archive/2008/10/26/65113.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>