1、实际上我们可以看到,防火墙并没有阻止这样的连接,而且这是最常见的连接请求和处理方式,我不理解的就是为什么防火墙没有阻止这样的连接,他是如何判断那条连接是因为connect80端口生成的?是不是TCP数据包里面有什么特别的标志,或者防火墙已经记住了什么东西?(socket要ip地址和端口号吗)。
2、在服务器上:与客户端一样也需要创建Socket,但是同样的它也不知道通信对象是谁,所以我们需要让客户端向服务器告知客户端的必要信息:IP地址和端口号。(socket要ip地址和端口号吗)。
3、if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2)
4、printf("recv()failed! ");
5、ret=listen(sListen,5);
6、while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。
7、为了接收广播数据包,数据报套接字不应该绑定到特定地址,尽管在某些实现中,当数据报套接字绑定到特定地址时也可能接收广播数据包。
8、ptr=(char*)&receiveMessage;
9、if(sServer==INVALID_SOCKET)
10、structsockaddr_insaServer;//地址信息
11、//closesocket(sListen);
12、Socket是和应用程明裤和序一起创建的。
13、对于Socket的认识,本文将从以下几个方面着手介绍:
14、switch socketn. 开关插座;开关灯座
15、一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
16、wVersionRequested=MAKEWORD(2,2);//希望使用的WinSockDLL的版本
17、在Socket编程接口里,设计者提出了一个很重要的概念,那就是socket。这个socket跟文件句柄很相似,实际上,在BSD系统里就是跟文件句柄一样存放在一样的进程句柄里。这个socket其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定对象进行操作——这其实是C语言的问题,在C++语言里,这个句柄其实就是this指针,实际就是对象指针啦。
18、wVersionRequested=MAKEWORD(2,2);//希望使用的WinSockDLL的版本
19、printf("Waitingforclientconnecting! ");
20、操作系统下面:就是网卡驱动程序,网卡驱动程序负责控制网卡硬件,驱动程序驱动网卡硬件完成收发工作。
21、#defineSERVER_PORT5208//侦听端口
22、后想立即重启,而新套接字依旧使用同一端口,此时SO_REUSEADDR选项非常有用。必须意识到,此时任何
23、一个指定的端口号不能被多个应用程序公用,比如IIS占用了80端口,那么APACHE就不能用这个端口了。
24、Q:编写TCP/SOCK_STREAM服务程序时,SO_REUSEADDR到底什么意思?
25、很多疑问都在文章里里找到了答案,特别是“端口是用来区分不同应用程序的”,之前也困惑多线程下,每个线程建立连接的端口是否可以相同。另外文中说每accept一个连接会得到一个新的socket,这个表述不是很完美,其实不是一个新的socket而是得到了客户端的socket,这个socket里的ip和端口当然是客户端的ip和端口了。表达accept客户端之后,服务端用的是哪个端口。
26、ret=WSAStartup(wVersionRequested,&wsaData);
27、ret=recv(sServer,ptr,5000,0);
28、saServer.sin_port=htons(SERVER_PORT);//注意转化为网络字节序
29、单个进程创建多个socket绑定不同的端口,TCP,UDP都行
30、数据收发操作是从应用程序调用write将要发送的数据交给协议栈开始的,协议栈收到数据之后执行发送操作。
31、closesocket(sListen);//关闭套接字
32、accept()产生的Socket端口号是多少?
33、明白socket只是对TCP/IP协议栈操作的抽象,而不是简单的映射关系,这很重要!
34、5)IP设计的目的是为了实现大规模主机的互联互通。
35、现在我们知道,socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等。
36、 灵活运用的程度不同 WebSocket 更易用,而 Socket 更灵活。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。 在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
37、ret=WSAStartup(wVersionRequested,&wsaData);
38、要写网络程序就必须用Socket,这是程序员都知道的,而且在面试的时候,我们也会问对方会不会socket编程,很多人都会说Socket编程基本就是listen、accept、以及send和write几个基本操作,是的就跟常见的文件操作一样,只要写过就一定知道。
39、对于普通Socket,我曾经有个模糊的问题,在多线程情况下,服务器端监听(listen)某个端口(假设8080)后,每accept一个客户端的连接就会产生一个新的Socket。那么这些新产生的Socket的端口是什么?程序里肯定没有指定,那就应该有两种可能,1:产生随机端口。2:还是8080端口。第一种假设想了就觉得不可能,防火墙非常有可能会阻止这些随机端口的包。那么就是第二种假设了,服务端端口还是80但这推翻了我原有的认识,就是“一个端口被程序占有,其他程序就不能用该端口了”。我觉得其实最有可能的是范围不同:就是在程序与程序间不能用同一端口,但是在程序内部不同的Socket还是可以用同一端口的。所以,为了能够使“客户端发给服务端的同一端口(8080)不同线程(即不同的Socket连接)的包能够被区分开并进行组合”,必须得有一个区分包是来自不同连接的显著特征,那就是传输层包头里的源端口了,即一个Socket连接里客户端那方的端口。总结一下,对于这种情况,就是传输层包头里源端口(客户端)会随着产生的Socket不同,而宿端口相同(服务器端)。
40、这些信息会传递给协议栈中的TCP模块,TCP模块会对请求报文进行封装,再传递给IP模块,进行IP报文头的封装,然后传递给物理层,进行帧头封装。
41、一个数据包经由应用程序产生,进入到协议栈中进行各种报文头的包装,然后操作系统调用网卡驱动程序指挥硬件,把数据发送到对端主机。
42、应用程序中有一个socket组件,在应用程序启动时,会调用socket申请创建Socket,协议栈会根据应用程序的申请创建Socket:首先分配一个Socket所需的内存空间,这一步相当于是为控制信息准备一个容器,但只有容器并没有实际作用,所以你还需要向容器中放入控制信息;如果你不申请创建Socket所需要的内存空间,你创建的控制信息也没有地方存放,所以分配内存空间,放入控制信息缺一不可。至此Socket的创建就已经完成了。
43、6)利用三元组(ip地址、协议、端口号)就可以标识网络的进程
44、charreceiveMessage(5000);
45、首先:客户端应用程序需要调用Socket库中的connect方法,提供socket描述符和服务器IP地址、端口号。
46、当控制流程上节中的连接过程回到应用程序之后,接下来就会直接进入数据收发阶段。
47、if(ret==SOCKET_ERROR)
48、而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已经使用中"。如果你的服务程序停止
49、原始套接字通常在网络设备中可用,用于路由协议,例如Internet组管理协议(IGMP)和开放最短路径优先(OSPF),以及用于Internet控制消息协议(ICMP)等事情,由ping实用程序。
50、2)客户端初始化Socket,然后连接服务(connect),如果连接成功(三次握手成功),这时客户端就和服务端建立了连接
51、接着,通过网络调试助手给这个服务器发送数据,结果显示,只有最后一个套接字sockfd_two会正常接收数据。
52、Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。
53、SOCKETsListen,sServer;//侦听套指高搏接字,连接套接字
54、后来我又仔细读了TCP/IP协议栈原理,对很多概念有了更深刻的认识,比如TCP和UDP同属于传输层,共同假设在IP层之上,而IP层主要负责在节点之间的数据包传输,这里的节点是一台网络设备,比如计算机,因为IP曾只负责把数据送到节点之上,而不能区分上面的不同应用,所以TCP、UDP在协议的基础上加入了端口的信息,端口是标识的是一个节点上的应用,处理增加端口信息,UDP协议基本就没有对IP层的数据进行任何处理了,而TCP协议还加入了更复杂的传输控制,比如滑动的数据发送窗口,以及接受确认和重发机制,以达到数据的可靠传输,不管应用层看到的是怎么样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。
55、需要注意的是,设置端口复用函数要在绑定之前调用,而且只要绑定到同一个端口的所有套接字都得设置复用:
56、printf("WSAStartup()failed! ");
57、特别说明:本文中提到的“Socket”、“网络套接字”、“套接字”,如无特殊指明,指的都是同一个东西哦。
58、1)TCP的设计就负责安全可纯喊靠的传输数据;
59、面向连接的套接字,使用传输控制协议(TCP)、流控制传输协议(SCTP)或数据报拥塞控制协议(DCCP)。流套接字提供了无记录边界的有序且独特的无错误数据流,并具有用于创建和销毁连接以及报告错误的明确定义的机制。
60、length=sizeof(saClient);
61、WORDwVersionRequested;
62、7)如果一个程序创建了Socket,并让其监听80端口(创建时会为其分配一个端口),其实是向TCP/IP协议栈声明了其对80端口的占用,之后,所有目标是80端口的TCP数据包都会转发给该应用程序
63、printf("listen()faild!code:%d ",WSAGetLastError());
64、如果是一个空闲的端口号,那么一定不是80端口了,于是以后的TCP数据包端口肯定就不是80了--防火墙会阻止他通过的。
65、在这种状态下:即使你让客户端应用程序委托协议栈发送数据,它也不知道发送到哪里。所以浏览器需要根据网址来查询服务器的IP地址,查询到目标主机后,再把目标主机的IP告诉协议栈。至此,客户端激盯这边就准备好了。
66、printf("connect()failed! ");
67、saServer.sin_port=htons(SERVER_PORT);//注意转化为网络节序
68、printf("InvalidWinSockversion! ");
69、有无连接数据包式套接字(SOCK_DGRAM),属于针对UDP方式的应用。
70、sClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
71、再核对应用层通讯报文的处理机制。也就是通讯双方事先约定好的规则,比如客户端必须发送hello,服务端才会返回world。
72、有面向连接的流式套接字(SOCK_STREAM),属于针对TCP方式的应用;
73、5)定时发送数据包(又名心跳包)以避免长时间不活跃而被关闭的Socket连接
74、下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。
75、Socket创建完成后,会返回一个Socket描述符给应用程序,这个描述符相当于是区分不同Socket的号码牌。根据这个描述符,应用程序在委托协议栈收发数据时就需要提供这个描述符。
76、Socket刚刚创建完成后,还没有数据,也不知道通信对象。
77、if(sListen==INVALID_SOCKET)