TCP/IP编程学习笔记(4)

无连接的客户/服务器程序工作流程

无连接的数据报(SOCK_DGRAM)传输服务在传输层使用UDP协议,与面向连接的协议不同的是,它不需要通信双方事先建立连接,通信的任意一方可以先发送数据,先发送数据的一方会成为客户端,接收数据的一方成为服务器端,在数据传输完成后,只需要关闭套接口,释放网络资源,通信过程就结束了。

无连接的数据报传输服务通信时,客户端与服务器端的工作流程类似:

1)使用WSAStartup()函数检查系统协议栈的安装情况:

WASASttartup(0x0202,&wsaData);

WASASttartup(MAKEWORD(2,2),&wsaData);

2)使用socket()函数创建套接口,以确定五元组的协议:
SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

3)使用bind()函数将创建的套接口与服务器地址绑定。它确定了相关五元组中的本地IP地址和端口号。

    常用的调用格式:bind(serverSocket,(const struct sockaddr*)&localaddr,sizeof(sockaddr));

4)使用sendto()函数发送数据,使用recvfrom()函数接收数据。

5)使用closesocket函数关闭套接口。

6)调用WSACleanup()函数,结束Windows API的调用。

至此,一次无连接的数据包传输过程结束。

TCP/IP编程学习笔记(4)_第1张图片
另:


1)通信的一方可以不用bind()绑定IP地址和端口,而由系统自动分配。

2)不绑定IP地址和端口的一方必须首先向绑定地址的一方发送数据。

3)无连接应用程序也可以调用connect()函数,但是它并不向对方发送建立连接的请求,内核只是将connect()中指定的目标方的IP地址和端口号记录下来,在以后的通信中就可以使用面向连接的数据发送函数send()和数据接收函数recv()。

4)无连接的数据报传输过程中,作为服务器的一方也必须先启动,否则客户请求传不到服务进程。
5)由于无连接的客户端一般不调用connect(),因此在数据发送之前,客户与服务器之间尚未建立一个全相关(五元组),打包各自通过socket()和bind()调用建立了半相关。发送数据时,发送方除指定本地套接口的地址外,还需指定接收方套接口的地址,从而在数据收发过程中动态地建立全相关。

你可能感兴趣的:(TCP/IP编程学习笔记(4))