TCP/IP编程学习笔记(3)
面向连接的客户/服务器程序工作流程
服务器端程序工作流程:
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()确定 |