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

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

服务器端程序工作流程:

1)使用WASASttartup()函数检查系统协议栈的安装情况。只有在协议栈安装正确的清空下,才可以执行之后的各步骤。
    常用的调用格式:

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

2)使用socket()函数创建服务器端通信的套接口。如果套接口创建不成功,也不能执行后续的各操作,并且要调用WASACleanup()函数,结束Windows Socket API的使用。这一步调用过程确定了相关五元组的协议。

    常用的调用格式:

SOCKET serverSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    调用不成功时返回INVALID_SOCKET.

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

    常用的调用格式:

bind(serverSocket,(const struct sockaddr*)&localaddr,sizeof(sockaddr));

4)使用listen()函数使服务器套接口做好接收连接请求的准备。该函数的调用格式如下:

listen(serverSocket,queuelen);

5)使用accept()或WSAAccept()函数接收来自客户端由connect()发出的连接请求。

常用格式:
    SOCKET Newsock=accept(serverSocket,(struct sockaddr*)&clientaddr,&clientaddr_len);

在该函数的参数中,由clientaddr参数返回客户端协议、IP地址和端口信息。至此,一个通信所需的五元组已建立。

6)根据连接请求建立连接后,使用send()函数发送数据,或使用recv()函数接收数据。

7)使用closesocket()函数关闭套接字,使用方法如下:

closesocket(serverSocket);

8)最后调用无参函数WSACleanup()结束Windows Socket API的使用。

  至此,服务器的工作过程结束。


客户端程序工作流程:

1)使用WASASttartup()函数检查系统协议栈的安装情况。同服务器端。

常用的调用格式:

WASASttartup(0x0202,&wsaData)

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

2)使用socket()函数创建客户端端通信的套接口。同服务器端。

    常用的调用格式:

SOCKET clientSocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

     如果客户想连接的计算机没有监听指定端口的进程,则请求连接的connect()调用就会失败,并发生代码为WSAECONNREFUSE的错误。当试图连接的计算机不能用,如客户与要连接的服务器之间路由不同、服务器主机硬件故障或者服务器不在网络上等,发生代码为WSAETIMEDOUT的错误。

    serveraddr参数是指向远程服务器地址的一个指针,因此要调用此函数前一定要知道远程服务器的地址和端口号,并把其值赋给serveraddr结构量,否则无法使用该函数。

4)建立连接后,使用send()函数发送数据,或使用recv()函数接收数据。

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

6)最后调用无参函数WSACleanup()。


五元组 协议 <本地IP地址,本地端口号> <远程IP地址,远程端口号>
服务器端五元组 由socket()确定 由服务器端调用bind()时确定 由accept()确定
客户端五元组 由socket()确定
由客户端的bind()调用确定。
如果客户端没有进行bind()调用,
或者调用了bind()但没有指定具体地址或端口,
则由系统内核自动确定地址和端口
由connect()确定

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