源码工作室

目标:通俗的语言说出通俗的技术\n 老婆开了个网店,园子里的优惠,决不假。(http://shop33647060.taobao.com)
posts - 84, comments - 625, trackbacks - 7, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 ::  :: 管理

揭开Socket编程的面纱

Posted on 2005-12-10 22:59 源码工作室 阅读(33622) 评论(66)  编辑 收藏 网摘 所属分类: 网络编程
        对TCP/IPUDPSocket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:

1.         什么是TCP/IPUDP
2.         Socket在哪里呢?
3.         Socket是什么呢?
4.         你会使用它们吗?

什么是TCP/IPUDP

         TCP/IPTransmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
         UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
        这里有一张图,表明了这些协议的关系。

                                                                               

                                                                        图1

       TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IPUDP的关系了吧。
Socket在哪里呢?
       在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。



2

       原来Socket在这里。
Socket是什么呢?
       Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
你会使用它们吗?
       前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
       一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。    生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

      

3

       先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
       在这里我就举个简单的例子,我们走的是TCP协议这条路(见图2)。例子用MFC编写,运行的界面如下:



4



5

       在客户端输入服务器端的IP地址和发送的数据,然后按发送按钮,服务器端接收到数据,然后回应客户端。客户端读取回应的数据,显示在界面上。
       下面是接收数据和发送数据的函数:

int    Receive(SOCKET fd,char *szText,int len)

{
       int cnt;
       int rc;
       cnt=len;

       while(cnt>0)
       {
              rc=recv(fd,szText,cnt,0);
              if(rc==SOCKET_ERROR)
              {
                     return -1;
             }

             if(rc==0)

                     return len-cnt;

              szText+=rc;

              cnt-=rc;

       }

       return len;

}

int Send(SOCKET fd,char *szText,int len)
{

       int cnt;

       int rc;

       cnt=len;

       while(cnt>0)

       {

              rc=send(fd,szText,cnt,0);

              if(rc==SOCKET_ERROR)

              {

                     return -1;

              }

              if(rc==0)

                     return len-cnt;

              szText+=rc;

              cnt-=rc;

       }

       return len;

}

服务器端:

       在服务器端,主要是启动Socket和监听线程。

#define DEFAULT_PORT      2000

void CServerDlg::OnStart()

{

       sockaddr_in local;

       DWORD dwThreadID = 0;

      

       local.sin_family=AF_INET;

       //设置的端口为DEFAULT_PORT

       local.sin_port=htons(DEFAULT_PORT);

       //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。

       local.sin_addr.S_un.S_addr=INADDR_ANY;

 

       //初始化Socket

       m_Listening = socket(AF_INET,SOCK_STREAM,0);

       if(m_Listening == INVALID_SOCKET)

       {

              return ;

       }

       //将本地地址绑定到所创建的套接字上

       if(bind(m_Listening,(LPSOCKADDR)&local,sizeof(local)) == SOCKET_ERROR )

       {

              closesocket(m_Listening);

              return ;

       }

       //创建监听线程,这样也能响应界面上操作。

       m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,&dwThreadID);

       m_StartBtn.EnableWindow(FALSE);

       m_StopBtn.EnableWindow(TRUE);

}

监听线程函数:
DWORD WINAPI CServerDlg::ListenThread(LPVOID lpparam)
{

       CServerDlg* pDlg = (CServerDlg*)lpparam;

       if(pDlg == NULL)

              return 0;

 

       SOCKET  Listening = pDlg->m_Listening;

       //开始监听是否有客户端连接。

       if(listen(Listening,40) == SOCKET_ERROR)

       {

              return 0;

       }

       char szBuf[MAX_PATH];

       //初始化

       memset(szBuf,0,MAX_PATH);

       while(1)

       {

              SOCKET ConnectSocket;

              sockaddr_in    ClientAddr;

              int                  nLen = sizeof(sockaddr);

              //阻塞直到有客户端连接,不然多浪费CPU资源。

              ConnectSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen);

              //都到客户端的IP地址。

              char *pAddrname = inet_ntoa(ClientAddr.sin_addr);

              pDlg->Receive(ConnectSocket,szBuf,100);

              //界面上显示请求数据。

              pDlg->SetRequestText(szBuf);

              strcat(szBuf," :我是老猫,收到(");

              strcat(szBuf,pAddrname);

              strcat(szBuf,"");

              //向客户端发送回应数据

              pDlg->Send(ConnectSocket,szBuf,100);

       }

       return 0;

}

       服务器端一直在监听是否有客户端连接,如有连接,处理客户端的请求,给出回应,然后继续监听。

客户端:

       客户端的发送函数:

#define DEFAULT_PORT      2000

void CClientDlg::OnSend()

{

       DWORD dwIP = 0;      

       TCHAR szText[MAX_PATH];

       memset(szText,0,MAX_PATH);

       m_IP.GetWindowText(szText,MAX_PATH);

       //把字符串形式的IP地址转成IN_ADDR结构需要的形式。

       dwIP = inet_addr(szText);

       m_RequestEdit.GetWindowText(szText,MAX_PATH);

 

       sockaddr_in local;

       SOCKET socketTmp;

       //必须是AF_INET,表示该socketInternet域中进行通信

       local.sin_family=AF_INET;

       //端口号

       local.sin_port=htons(DEFAULT_PORT);

       //服务器的IP地址。

       local.sin_addr.S_un.S_addr=dwIP;

      

       ////初始化Socket

       socketTmp=socket(AF_INET,SOCK_STREAM,0);

       //连接服务器

       if(connect(socketTmp,(LPSOCKADDR)&local,sizeof(local)) < 0)

       {

              closesocket(socketTmp);

              MessageBox("连接服务器失败。");

              return ;

       }

       //发送请求,为简单只发100字节,在服务器端也规定100字节。

       Send(socketTmp,szText,100);

       //读取服务器端返回的数据。

       memset(szText,0,MAX_PATH);

       //接收服务器端的回应。

       Receive(socketTmp,szText,100);

 

       TCHAR szMessage[MAX_PATH];

       memset(szMessage,0,MAX_PATH);

       strcat(szMessage,szText);

       //界面上显示回应数据。

       m_ReplyBtn.SetWindowText(szMessage);

       closesocket(socketTmp);

}

       客户端就一个函数完成了一次通信。在这里IP地址为何用127.0.0.1呢?使用这个IP地址,服务器端和客户端就能运行在同一台机器上,这样调试方便多了。当然你可以在你朋友的机器上运行Server程序(本人在局域网中测试过),在自己的机器上运行Client程序,当然输入的IP地址就该是你朋友机器的IP地址了。
       简单的理论和实践都说了,现在Socket编程不神秘了吧?希望对你有些帮助。                    

Feedback

#1楼   回复  引用  查看    

2005-12-10 23:16 by 天生这样      
Windows网络编程

很值得看看

#2楼   回复  引用  查看    

2005-12-11 11:12 by wddavid      
其实那种语言都差不多的, 最好先学一下网络协议...

#3楼   回复  引用  查看    

2005-12-11 14:46 by shootingstars      
BSD Socket是一个网络编程的API接口,它并非仅仅针对IP协议的。
把Socket放到TCP/UDP的协议上层似乎不是太妥当?

#4楼[楼主]   回复  引用  查看    

2005-12-11 15:12 by 源码工作室(lcstudio.zj.com)      
其实socket也没有层的概念,在文章中我说过,它其实是一个facade设计模式的应用,让编程变的更简单。是一个软件抽象层。在网络编程中,我们大量用的都是通过socket实现的。

#5楼   回复  引用  查看    

2005-12-11 17:14 by 双鱼座      
将socket理解为tcp/udp的facade的确不够恰当。第一,socket并不是以面向对象的方式提供的,在这里引用面向对象和设计模式的术语失妥。第二,socket事实上并不是留给编程开发的,而是留给网络操作系统实现协议栈的一个支持模型。例如berkeley socket和windows socket。至于编程开发时使用的socket模型和相应的API,则是操作系统服务API。事实上socket也不是tcp/udp服务的全部而是部分。
不过文章归纳得还不错,只是没有提到tcp/udp中端口的概念是一大遗憾。如果用电话来对应网络会话的话,端口应该正好比分机号。

#6楼[楼主]   回复  引用  查看    

2005-12-11 18:45 by 源码工作室(lcstudio.zj.com)      
其实对于facade设计模式,我的理解是不能局限于面向对象。facade定义是把很多复杂的东西放在后面,客户只需通过简单的接口,而不需要知道下面复杂的逻辑等。
当然由于我对socket还没有能达到很高的境界,所以还有很多不知的。我自己也正在学习,比如在socket编程中,select函数还是有很重要的地位的,等自己正在明白了,还会有下篇的介绍。

#7楼   回复  引用  查看    

2005-12-11 21:37 by Cdo      
有没有谁能详细说说nat打洞的具体过程和代码,特别是代码:)

#8楼   回复  引用    

2005-12-12 04:59 by 航天奇侠
图片作的很好,我觉得介绍全局和概述的文章,图片是比文字要好些。
请问是用什么工具作的?

#9楼   回复  引用  查看    

2005-12-12 08:02 by 双鱼座      
楼主不够谦虚!楼主可能为自己“创造性地”将socket理解为tcp/ip的facade偷偷高兴呢,其实极其错误!
tcp/ip仅仅是一套协议、规范,并没有实体存在,是完全抽象的;socket模型则是清晰而具体的。而大部分情况下,门面模型是可有可无的,只是为了满足封装一个简单的外部门面而存在的,而你根本没有绕开socket去直接操纵tcp/ip的可能。换句话说,tcp/ip和socket并没有相提并论的前提,根本是为了解决同一个问题的两个步骤,是完全分离的。

#10楼[楼主]   回复  引用  查看    

2005-12-12 08:34 by 源码工作室(lcstudio.zj.com)      
我想这不是谦虚不谦虚的问题,有问题就可以争论,你说呢?
有一点我想你说错了,牛人是可以绕过socket去直接操纵tcp/ip的,只要他对tcp/ip协议很了解。就说好的抓包程序,单用socket是无法实现的。

to 航天奇侠:
是用SmartDraw软件作的图。

#11楼   回复  引用    

2005-12-12 10:01 by yf2008[未注册用户]
关系是不是搞反了哟。tcp/ip应该是建立在socket的基础之上的,"绕过socket去操作tcp/ip",还是第一次听到这样说。

#12楼[楼主]   回复  引用  查看    

2005-12-12 11:02 by 源码工作室      
我们平时说的TCP/IP其实是一组协议,而不是一个叫TCP/IP的协议,它包括运输层,网络层,链路层。
我们经常用的是TCP和UDP。

#13楼   回复  引用  查看    

2005-12-12 11:13 by 双鱼座      
我晕...抓包程序?基本上是使用raw socket(原始套接字)实现的,这是socket的高级功能,并不是因为对tcp/ip协议很了解,而是对socket很了解(当然不了解tcp/ip也无法理解高级的socket)。离开特定操作系统(或者虚拟机)讨论tcp/ip的编程是没有意义的。
@yf2008:没有tcp/ip建立在socket之上或者socket建立在tcp/ip之上这样的说法,都有自己的独立的完整体系,其功能也完全不同。

#14楼[楼主]   回复  引用  查看    

2005-12-12 11:24 by 源码工作室      
raw socket其实就是跳过TCP,UDP这一层。用socket我们不光是只发数据了,还要TCP和UDP的头。
为何不能跳过socket呢?我个人觉得可以。跳过它,都自己干。当然这要很大的勇气和足够的知识。呵呵。
我看socket编程还是有很多讨论的地方的吗?欢迎多加讨论,这样我们就能搞清楚它了。共同进步是我们的目标。

#15楼   回复  引用  查看    

2005-12-12 11:37 by shootingstar      
呵呵,越讨论越乱了 *_*
谈谈我的看法:
ip仅仅是一个协议,大家按照这个协议规范来发送和解析这个某个流。

大家可以自己一个字节一个字节来构建自己的IP数据报文,并非一定需要通过socket接口。(通过流行的winpcap,你可以抛开socket,发送自己构建的任意的IP报文)

socket是一个大家都认为好用的构建和解析IP协议的接口而已(当然socket并非仅仅能够构建和解析ip协议),其实有很多嵌入式设备还有其他的网络通讯接口(比如LWIP)。只不过在大部分操作系统上socket更加通用而已。

将socket放在tcp协议的上层或许说有些不妥,那么将tcp放在socket上层就更没有道理了。抓包程序完全可以不利用raw socket,目前的sniffer都是直接从驱动程序获得网络流,然后自己解析的。

#16楼[楼主]   回复  引用  查看    

2005-12-12 13:09 by 源码工作室      
shootingstar:
我同意你的观点。
在我的文章中,我把socket看成一个抽象层,其实它不和运输层,网络层,链路层是同一概念的。看成一个抽象层,是为了更好的表达我想说的意思。在我看来,socket就是一组API,它把复杂的协议都放在后面了。

#17楼   回复  引用  查看    

2005-12-13 14:12 by 双鱼座      
固执的楼主还在坚持tcp有一个叫socket的facade吗?

@shootingstar:
当然可以不通过raw socket抓包,直接从数据链路层截获数据的话与tcp/udp就没有任何关系了。我的意图是针对楼主的socket是tcp/udp的facade的讲法的,并没有说只能通过raw socket抓包。

#18楼[楼主]   回复  引用  查看    

2005-12-13 14:48 by 源码工作室      
什么是facade模式,你知道吗?
为一组具有复杂且全面的接口对象提供一个简单特定的接口。

我没有说tcp有一个叫socket的发擦的,而是tcp/ip,把tcp/ip协议看成一个协议的子系统,socket是一组API,难道不像facade模式吗?
我不是听了你上面的话而感到气愤,也不是我固执,主要是你没有给我很有力的理由。

#19楼   回复  引用  查看    

2005-12-23 11:53 by 关山月      
Windows网络编程

很值得看看

----- 入门的还是看看 <unix network programming> 吧,Windows 网络编程的看完了,可能还不知道什么是 keepalive.

#20楼   回复  引用    

2005-12-27 11:34 by .net123321[未注册用户]
很好~同志你辛苦了。。。!

#21楼   回复  引用    

2005-12-28 10:57 by wu ming[未注册用户]
也许<<红楼梦>>里的<<好了歌>>各位可以体会体会。

#22楼   回复  引用    

2006-03-10 17:27 by 图片来源[未注册用户]
图片是《TCPIP详解》上面的

#23楼   回复  引用  查看    

2006-04-14 09:33 by 惊艳一枪      
悄悄的問下樓主:
上面的這個程序,可以處理多客戶端同時與服務器通訊嗎?

不太熟悉C++,不好意思。

#24楼[楼主]   回复  引用  查看    

2006-04-14 10:49 by 源码工作室      
现在这个还不行,这只是最基础的。
處理多客戶端同時與服務器通訊,这还要用的select等函数,那还要看很多的书呢。

#25楼   回复  引用    

2006-06-23 09:19 by victor.li.livingstone[未注册用户]
大家可以继续讨论XML通过网络流进行对象的网络传输问题,以及可以加入内存流来帮助实现和解决此问题。如果大家愿意,可以加我qq:25102008,请求信息为:编程爱好者。本人是一家医疗设备研发公司的技术主管。

#26楼   回复  引用    

2006-06-23 09:23 by victor.li.livingstone[未注册用户]
如果大家理解了以上我们所讨论的内容,那我们就能理解网络游戏网络部分编程的全过程。我希望大家能齐心协力,共同进步,能够围绕同一个目标,形成一个技术团体,攻克所有技术难题。

#27楼   回复  引用    

2006-07-07 16:39 by famu[未注册用户]
楼主果然是揭了面纱,里面的东西还多着呢,知道IOCP不?

#28楼[楼主]   回复  引用  查看    

2006-07-08 21:13 by 源码工作室      
楼上的不要说的太偏激吗。
其实对socket我不是很专业的,但在看书的时候,我能写下来,其实就是好的。
说句不好听的话,我懂的很多你也不知道啊。
每个人都有自己的特长和不足的。

#29楼   回复  引用    

2006-07-18 11:29 by dyw31415926@163.com[未注册用户]
你们都是高手啊,我是刚学呀,什么都不懂,我看楼主的程序好有趣啊, 能不能发个源程序给我啊,要调试好的呀,不然我几天都改不了 让我玩玩,研究一下,我是邮箱是dyw31415926@163.com
谢谢各位的大侠啊

#30楼   回复  引用    

2006-07-18 11:34 by dyw31415926@163.com[未注册用户]
你们都是高手啊,我是刚学呀,什么都不懂,我看楼主的程序好有趣啊, 能不能发个源程序给我啊,要调试好的呀,不然我几天都改不了 让我玩玩,研究一下,我的邮箱是dyw31415926@163.com

谢谢各位大侠啊

对了,顺便介绍一下程序运行的环境,要是是vs2003.net的话,那是mfc程序吗?努力向高手请教中.

#31楼   回复  引用    

2006-07-18 11:35 by dyw31415926@163.com[未注册用户]
希望程序是用vs2003做的,我只只有vs2003.net

#32楼[楼主]   回复  引用  查看    

2006-07-18 12:10 by 源码工作室      
@dyw31415926@163.com:
不好意思,写得比较早,换了个公司,源程序不知还能否找到,我是用MFC的。因为这里只做简单的界面而已。

#33楼   回复  引用    

2006-09-07 13:03 by lptstr[未注册用户]
请问一个问题:
客户端与服务器端在同一台机器上运行(有网卡,有内部ip地址,采用dhcp
分配的ip)。客户端调用connect连接服务器端时,若连接127.0.0.1,就会出错,WSAGetLastError为10061(含义为:不能做任何连接,因为目标机器积极地拒绝它)。但写为本机的实际ip就行。
为什么?请高人解答,谢谢。

#34楼   回复  引用    

2006-10-16 10:32 by litant[未注册用户]
请教楼主一个问题:
情况描述:
在异常断网的情况下(比如断电,或者断网线),网络连接为什么仍然显示为“Establish”. 用netstat -na察看
参数配置:
OS是:HPUnix V11
TCP/IP的参数配置:
tcp_time_wait_interval:60000(ms)
tcp_keepalive_internal:60000(ms)
tcp_keepalive_kill: 1次

我现在的怀疑是应用程序关于socket程序的问题,想请教楼主socket程序在什么情况才会出现上述情况。非常谢谢!

#35楼   回复  引用  查看    

2006-12-01 17:54 by 小峰      
学写了。

#36楼   回复  引用    

2007-01-09 07:51 by 初学者[匿名][未注册用户]
看了版主讲得很好,目前处于刚学Socket编程阶段。
请把Socket编程的源码发一份到我的邮箱(liulan2580@163.com )。谢谢~

#37楼[楼主]   回复  引用  查看    

2007-01-09 08:55 by 源码工作室      
楼上的不好意思了,源代码找不到了。
你自己就按上面的打一下吧,其实自己照着做一遍,会对你有很大的帮助。

#38楼   回复  引用    

2007-02-06 12:37 by 初学者[未注册用户]
请问此句的使用方法,没看明白。

m_hListenThread = ::CreateThread(NULL,0,ListenThread,this,0,&dwThreadID);

#39楼[楼主]   回复  引用  查看    

2007-02-06 21:25 by 源码工作室      
这句是创建一个线程。

#40楼   回复  引用    

2007-03-21 13:21 by lazymaple[未注册用户]
你好!我是初学者。我已保存你的文章。谢谢了。

#41楼   回复  引用    

2007-04-18 08:33 by maoliu99[未注册用户]
不用MFC可以实现吗?

#42楼   回复  引用    

2007-04-18 08:45 by maoliu99[未注册用户]
很高兴与大家交流!QQ:26432327

#43楼[楼主]   回复  引用  查看    

2007-04-19 08:50 by 源码工作室      
@maoliu99:
不用MFC完全可以实现啊,现在的OS基本都要socket编程的。

#44楼   回复  引用    

2007-04-25 15:13 by zzqbox@yahoo.com.cn[未注册用户]
讨论的很好,本来不是很明白,现在明白了

#45楼   回复  引用    

2007-04-29 23:16 by 初学网络编程[未注册用户]
楼主 本人初学网络编程,想搞一个关于RADIUS认证系统 ,不知道就上面那个代码 ,还要在哪些方面 添加一些 什么代码。望指教。本人邮箱 ruy1985@163.com、我也用MFC作的 感觉就控件很直观 ^_^。

#46楼   回复  引用    

2007-05-10 21:35 by lily[未注册用户]
阅 学习

#47楼   回复  引用  查看    

2007-05-16 09:26 by 兰亭      
谢谢,对我帮助很大

#48楼   回复  引用    

2007-05-26 01:05 by hurrysea[未注册用户]
本来以为很明白,现在不明白了

#49楼   回复  引用    

2007-05-26 09:52 by xsdan[未注册用户]
你好,能在SOCKET中控制某个电脑(知道计算机名)不能和服务器交换数据吗

#50楼   回复  引用    

2007-05-29 17:28 by DSP开发[未注册用户]
各位好:
我是一位硬件工程师,现在有一合作项目,供有兴趣的参考。
设备类型:电力设备远传控制
网络媒体:光纤
设备接口:RTL8019
合作意向:设备的CPU是DSP,硬件已经提供了标准的10M网络接口,
寻找能够
编写网络基础通讯的软件人员,

#51楼   回复  引用    

2007-05-29 17:32 by DSP开发[未注册用户]
各位好:
我是一位硬件工程师,现在有一合作项目,供有兴趣的参考。
设备类型:电力设备远传控制
网络媒体:光纤
设备接口:RTL8019
合作意向:设备的CPU是DSP,硬件已经提供了标准的10M网络接口,
寻找能够编写网络基础通讯的软件人员,规划网络的通讯协议及编写
PC程序,合作方式,及其他具体事宜,可进一步联系。
有兴趣请联系:WCYXHS@jnnc.com


#52楼[楼主]   回复  引用  查看    

2007-05-30 12:34 by 源码工作室      
xsdan:
可以的啊,socket是传输的手段,至于传输什么,就是用户自己决定了。

#53楼   回复  引用    

2007-06-13 14:37 by cj[未注册用户]
楼主我现在做一个socket服务端要把客户端发来的数据用ADO
在数据库比对并入库然后向客户端返回结果
客户端很多并不间断的连接服务端发数据
这需要多线程您能不能帮我看看在什么地方家线程怎么做
谢谢

#54楼   回复  引用    

2007-06-28 15:47 by xxmv99[未注册用户]
还是不是很理解啊。。。

#55楼   回复  引用    

2007-08-07 16:46 by funair[未注册用户]
bucuo

#56楼   回复  引用    

2007-08-11 02:29 by 探路.....[未注册用户]
謝謝樓主,詳細認真的表述了自己的學習心得,樓主對這篇文章傾注了很多的心血,也是對自己學習過程中一次很好的總結,討論也很好,雖然言辭比較激烈,但總的來說是一次對大家都互相提高討論,這樣的討論很不錯,呵呵,一個人在學習過程中對某些東西的認識也許有些偏差,在託討論過程是對自己學過的知識的集中爆發,也許會使自己對某些概念的模糊認識出現迷霧頓開的意境,希望這樣的討論能經常看到

#57楼[楼主]   回复  引用  查看    

2007-08-14 09:09 by 源码工作室      
谢谢楼上的支持

#58楼   回复  引用    

2007-09-20 13:31 by lanhuacao [未注册用户]
我是一个初学者,刚刚才接触到,现在正处在一头雾水状态,看到那些函数我都快有点想发疯的感觉了
哪位朋友可以帮帮我不?我的QQ:497718668

#59楼   回复  引用    

2007-12-13 17:33 by asdas[未注册用户]
socket函数有选项可以把主机设置成监听状态,也就是不分ip接受所有的数据包
抓包是不是就是这样实现的?
socket服务器一般应该是多线程实现的吧?
应该是在accept那地方实现
accept函数返回一个接口套,可以通过该接口套和客户端通讯

#60楼[楼主]   回复  引用  查看    

2007-12-29 09:19 by 源码工作室      
socket服务器我想应该是多线程的。
对于socket开发,这篇文章也是我学习的作品,所以有很多问题我可能都回答不了,还请谅解。

#61楼   回复  引用  查看    

2008-01-02 15:52 by 蓝天旭日      
经典!

#62楼   回复  引用    

2008-01-07 15:18 by driver[未注册用户]
博主对TCP/IP协议的理解有问题,估计你没有花多少精力去看计算机网络理论,对网络协议的理解也有限。我看你的第一个和第二个图发现的,首先ARP, RARP是网络层的协议,不过是网络层的底层协议所以容易理解成链路层。最主要的问题还是你把物理层放到链路层去了。你对链路层的理解有问题。
套接字可以分为三类:流式套接字,数据报套接字,原始套接字。嗅探软件用的是原始套接字,原始套接字允许对底层协议直接访问,主要用于开发其他的协议。另外两类套接字是平常我们常用的控制层协议。
我也是搜索网络方面的资料找到这里的,感觉你好像是学硬件出身在计算机理论上功力欠缺。

#63楼[楼主]   回复  引用  查看    

2008-01-11 17:36 by 源码工作室      
楼上的,如果你对第一副图有疑问,那你要去找大师级人物了。呵呵

#64楼   回复  引用    

2008-01-17 17:06 by beasky[未注册用户]
谢谢楼主,讲得很清楚明了。以前曾经用socket做过一个项目,当时对socket编程的还不是很清楚。至少现在看了你的文章及大家的讨论,使我socket编程更加清楚明了了.期待楼主的关于添加select函数处理多客户端的例子。

#65楼   回复  引用  查看    

2009-05-20 21:46 by 范小特      
好文,学习了

#66楼   回复  引用  查看    

2009-05-31 16:15 by 段启锋      
咔咔
啥也不说了 好!!!!



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 294652




相关文章:

相关链接: