
private async Task ProcessWSChat(AspNetWebSocketContext arg)
{
var sw = new Stopwatch();
swStart();
WebSocket socket = argWebSocket;
while (true)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult result = await socketReceiveAsync(buffer, CancellationTokenNone);
if (socketState == WebSocketStateOpen)
{
string message = EncodingUTF8GetString(bufferArray, 0, resultCount);
string returnMessage = "You send :" + message + " at" + DateTimeNowToLongTimeString();
buffer = new ArraySegment<byte>(EncodingUTF8GetBytes(returnMessage));
await socketSendAsync(buffer, WebSocketMessageTypeText, true, CancellationTokenNone);
}
else
{
break;
}
}
swStop();
//swElapsed;
}服务器初始化
(1)调用socket,建立文件描述符
(2)调用bind,将文件描述符与ip/port链接起来。若端口号已被占用,则bind失败
(3)调用listen,声明该文件描述符是服务器的一个文件描述符,为以后的accept作准备
(4)调用accept,并处于阻塞状态,等待客户端链接
创建链接
(1)调用socket,建立文件描述符
(2)调用connect,向服务器发起链接请求。
(3)connect会发送一个请求SYN段并阻塞等待服务器应答(第一次)
(4)服务器收到SYN,会给客户端发送一个确认应答的同时发送一个请求(SYN+ACK),表示赞成创建链接(第二次)
(5)客户端收到客户端发的SYN+ACK段,代表客户端链接已创建成功,进入ESTABLISHED状态,从connect()。客户端再向服务器发送一个ACK段,服务器收到后则服务器端链接也创建成功,服务器也进入ESTABLISHED状态。
a98328b87f4c48d3b44670f231eaa59agif
数据传输
(1)链接创建成功后,在同一链接、同一时刻,通讯双方可同时写数据(全双工)
(2)服务器端从accept()返回后调用read()开始读数据,若没有数据则阻塞等待
(3)客户端调用write()向服务器发送数据请求,客户端收到以后调用read()处理请求,此过程服务器调用read()阻塞等待
(4)服务器调用write()将处理好的请求发送给客户端,再次调用read()等待下一个请求
(5)客户端收到后从read()返回,发送下一条请求,如此循环下去web
断开链接
(1)没有数据处理了,则客户端调用close()关闭链接,给服务器端发送一个断开链接请求FIN段(第一次)
(2)服务器收到客户端的FIN段,给客户端发送一个确认应答ACK段代表赞成断开链接,客户端收到ACK段并调用read()返回0,代表客户端链接已断开(第二次)
(3)read()返回0以后,服务器知道客户端已断开链接,它也调用close()关闭链接,给客户端发送一个断开链接请求FIN段(第三次)
(4)客户端接收到服务器端发送的FIN段,给服务器一个确认应答ACK段,代表赞成断开链接。客户端进入TIME_WAIT状态,服务器收到客户端的ACK后则服务器断开链接。
a98328b87f4c48d3b44670f231eaa59agif 服务器
总结:
1为何是三次握手而不是两次或四次握手?
(1)若是是两次握手,则客户端发送链接请求SYN,服务器端接收链接请求并给客户端发送一个ACK进入ESTABLISHED状态,服务器端认为链接创建成功。有可能服务器端发送的ACK在传输过程当中丢了,客户端没有收到ACK从而认为链接没有创建成功。客户端认为链接没有创建成功则会不停的发送链接请求,而服务器认为链接成功则须要文虎相应的资源来管理链接,但这个链接无心义,服务器在维护的时候会浪费服务器资源。形成空间与时间上的浪费,从而形成内存泄漏的问题。四次握手问题同二次握手。
(2)三次握手的最后一次传送数据有可能也会形成丢包问题,可是此时客户端认为链接创建成功而服务器认为链接创建没成功,对服务器没有太大的消耗。客户端给服务器端发送数据,服务器端不进行接收。
三次握手已经知足需求就不须要更屡次的握手。
(3)创建链接是双方的事情,双方都须要创建链接再互相确认,有点像四次握手。可是由于由于TCP能捎带应答,因此服务器向客户端的请求创建链接的SYN以及对客户端的ACK能够一块儿发送,从而致使了三次握手。
2为何是四次挥手?
释放链接是两方的事情,双方发送断开链接请求后还须要确认,并且服务器对客户端的ACK以及FIN不能合并,因此是四次挥手
服务器端对客户端的FIN及ACK不能合并是由于客户端断开链接代表客户端没有数据发送给服务器了,不带表服务器没有数据发给客户端,则服务器向客户端发送ACK以后到服务器发送FIN之间有时间间隔,因此两步骤不能合并
3为何有TIME_WAIT状态?
如服务器端将最后一个断开链接请求发送以后,客户端收到FIN后给服务器端发送一个确认应答ACK,但在传输过程当中可能会丢包,这个ACK没有被服务器收到。当服务器在必定时间内没有收到ACK时会从新发送请求,因此客户端须要一个TIME_WAIT时间等待,解决丢包重传问题。一个TIME_WAIT的时间是2MSL。
哪一方先断开链接就先进入TIME_WAIT等待时间。socket
相关资源:基于Tcp协议的服务器与客户端通信之客户端_tcp客户端与服务器通信TCP/IP协议是一个协议集合,>>我没用过你用的那个平台,但是我做过基于TCP的socket编程,原理是这样的:
一、原理
1基于TCP协议的服务器端程序流程:
1)创建套接字(socket)
2)绑定套接字(bind)
3)将套接字设为监听,准备接收客户请求(listen)
4)等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept)
5)用返回的套接字与客户端进行通信(send/recv)
6)返回,等待另一客户请求
7)关闭套接字
2基于TCP协议的客户端程序流程
1)创建套接字(socket)
2)向服务器发出连接请求(connect)
3)和服务器端进行通信(send/recv)
4)关闭套接字
在服务器端调用accept函数时,程序就会等待客户端调用connect函数发出连接请求,然后接收请求,于是
双方就建立了连接,之后,服务器端和客户端就可以利用send和recv函数进行通信了。
另外我在网上找到过CS模式的socket编程的程序,实现的步骤就和上面的原理说的步骤一致,现在借花献佛就给你看看吧,程序如下:
服务器端:
#include <Winsock2h>
#include <stdioh>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaDatawVersion ) != 1 ||
HIBYTE( wsaDatawVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrvsin_addrS_unS_addr=htonl(INADDR_ANY);
addrSrvsin_family=AF_INET;
addrSrvsin_port=htons(6000);
bind(sockSrv,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR)&addrClient,&len);
char sendBuf[100];
sprintf(sendBuf,"这里写你要发送的内容",
inet_ntoa(addrClientsin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}
客户端程序:
#include <Winsock2h>
#include <stdioh>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaDatawVersion ) != 1 ||
HIBYTE( wsaDatawVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrvsin_addrS_unS_addr=inet_addr("127001");//这里的IP改为服务器端得IP地址
addrSrvsin_family=AF_INET;
addrSrvsin_port=htons(6000);
connect(sockClient,(SOCKADDR)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);
closesocket(sockClient);
WSACleanup();
}
你自己参考下吧,服务器端绑定的ip为运行服务器程序电脑的IP,端口为6000,客户端要连服务器就要制定连接函数的IP德参数为服务器端得IP。终于你说的什么属性无非是设置前面的协议,绑定,监听的参数,实现就应该是对发送和接受函数的实现吧,对你有帮助吗?TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议,在 OSI模型中,它完成第四层传输层所指定的功能。\x0d\UDP:是User Datagram Protocol的简称,用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。\x0d\TCP和UDP传输就类似于我们的手机通电话和手机发短信,一种必需连通了,才能够通话,相对来说比较可靠,传输速度比较快,另一种可以在关机状态(无连接)发送信息,相对来说,可靠性比较差,传输速度较慢。具体的差别如下:\x0d\TCP协议面向连接,UDP协议面向非连接 \x0d\ TCP协议传输速度慢,UDP协议传输速度快 \x0d\ TCP协议保证数据顺序,UDP协议不保证 \x0d\ TCP协议保证数据正确性,UDP协议可能丢包 \x0d\ TCP协议对系统资源要求多,UDP协议要求少\x0d\不管是基于TCP还是基于UDP的网络通讯编程,都要区分服务器端和客户端,下面以TCP为例,实现客户端和服务器端通讯的实现步骤:\x0d\TCP服务器端的编写步骤:\x0d\1 首先,你需要创建一个用于通讯的套接口,一般使用socket调用来实现。这等于你有了一个用于通讯的电话:) \x0d\ 2 然后,你需要给你的套接口设定端口,相当于,你有了电话号码。这一步 一般通过设置网络套接口地址和调用bind函数来实现。 \x0d\ 3 调用listen函数使你的套接口成为一个监听套接字。 以上三个步骤是TCP服务器的常用步骤。 \x0d\ 4 调用accept函数来启动你的套接字,这时你的程序就可以等待客户端的连接了。 \x0d\ 5 处理客户端的连接请求。 \x0d\ 6 终止连接。\x0d\TCP编程的客户端一般步骤是:\x0d\1、创建一个socket,用函数socket();\x0d\ 2、设置socket属性,用函数setsockopt(); 可选\x0d\ 3、绑定IP地址、端口等信息到socket上,用函数bind(); 可选 \x0d\ 4、设置要连接的对方的IP地址和端口等属性;\x0d\ 5、连接服务器,用函数connect()(相当于拨号); \x0d\ 6、收发数据,用函数send()和recv(),或者read()和write()(相当于通话);DNS服务器出错,最好将所有获取到DNS服务器IP地址的选项设置为自动获取。也可能是你当地运营商的DNS服务器出现错误,或路由器DNS配置出错。若是你本地出错,将你路由器和电脑的DNS设置为自动获取。若是运营商出错,过段时间就正常了。TCP/IP是供已连接因特网的计算机进行通信的通信协议。
TCP/IP协议TransmissionControlProtocol/InternetProtocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。
TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。
TCP/IP传输协议是严格来说是一个四层的体系结构,应用层、传输层、网络层和数据链路层都包含其中。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)