网络编程常用的协议和函数
一、 需要理解的协议
1. PPP :点对点协议(Point to Point Protocol)。点对点协议(PPP )为在点对点连接上传输多协议数据包提供了一个标准方法。
2. ARP :地址解析协议(address resolution Protocol)。ARP 实现通过IP 地址得知其物理地址。
3. RARP :反向地址转换协议(RARP :Reverse Address Resolution Protocol)。反向地址转换协议(RARP )允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。
4. IP :IP 是英文Internet Protocol(网络之间互连的协议)的缩写,中文简称为“网协”,也就是为计算机网络相互连接进行通信而设计的协议。
5. ICMP:ICMP 是(Internet Control Message Protocol)Internet 控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP 主机、路由器之间传递控制消息。
6. IGMP:Internet Group Management Protocol (Internet组管理协议) 。Internet 组管理协议(IGMP )是因特网协议家族中的一个组播协议,用于 IP 主机向任一个直接相邻的路由器报告他们的组成员情况。
7. TCP: Transmission Control Protocol 传输控制协议TCP 是一种面向连接的、可靠的、基于字节流的传输层(Transport layer)通信协议。
8. UDP: User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
9. HTTP:超文本传送协议(hypertext transport protocol)。一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
10. DNS:计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,它是由解析器和域名服务器组成的。域名系统为Internet 上的主机分配域名地址和IP 地址。
11. SMTP:(Simple Mail Transfer Protocol)即简单邮件传输协议, 它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
12. FTP:(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议。
13. POP3:(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机
如何连接到互联网上的邮件服务器进行收发邮件的协议。
14. TFTP :(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的
一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。
二、 基本套接字编程接口函数
1. WSAStartup :应用程序或DLL 只能在一次成功的WSAStartup()调用之后才能调
用进一步的Windows Sockets API函数.
原型:intPASCAL FAR WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );
参数: wVersionRequested Windows Sockets API提供的调用方可使用的最高版本号. 高位字节指出副版本(修正) 号, 低位字节指明主版本号.
lpWSAData 指向WSADATA 数据结构的指针, 用来接收Windows Sockets实现的细节
返回值: 0 成功.
以下值代表错误:
WSASYSNOTREADY 指出网络通信依赖的网络子系统还没有准备好.
WSAVERNOTSUPPORTED 所需的Windows Sockets API的版本未由特定的 Windows Sockets实现提供.
WSAEINVAL 应用程序指出的Windows Sockets版本不被该DLL 支持.
2. closesocket :关闭一个套接口。
原型:int PASCAL FAR closesocket( SOCKET s);
参数: s :一个套接口的描述字。
返回值: 0 成功.
以下值代表错误:
WSANOTINITIALISED :在使用此API 之前应首先成功地调用WSAStartup()。 WSAENETDOWN :WINDOWS 套接口实现检测到网络子系统失效。
WSAENOTSOCK :描述字不是一个套接口。
WSAEINPROGRESS :一个阻塞的WINDOWS 套接口调用正在运行中。
WSAEINTR :通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。 WSAEWOULDBLOCK :该套接口设置为非阻塞方式且SO_LINGER设置为非零超时间隔。
3. WSACleanup :中止Winsock 2 DLL (Ws2_32.dll) 的使用。释放WinSock 实现分
配给应用程序的系统资源。
原型:int PASCAL FAR WSACleanup ( void );
参数:无
返回值:成功返回0
4. socket :创建一个能够进行网络通信的套接字。
原型:int socket(int domain, int type, int protocol);
参数: 第一个参数指定应用程序使用的通信协议的协议族,对于TCP/IP协议族,该参数置AF_INET;
第二个参数指定要创建的套接字类型,流套接字类型为SOCK_STREAM、数据报套接字类型为SOCK_DGRAM、原始套接字SOCK_RAW(WinSock接口并不适用某种特定的协议去封装它,而是由程序自行处理数据包以及协议首部); 第三个参数指定应用程序所使用的通信协议。
返回值: 成功返回新创建的套接字的描述符,失败返回INVALID_SOCKET。
5. send:经套接字传送消息
原型:ssize_t send ( int s , const void *msg , size_t len , int flags);
参数:
第一个参数指定发送端套接字描述符;
第二个参数指明一个存放应用程式要发送数据的缓冲区;
第三个参数指明实际要发送的数据的字节数;
第四个参数一般置0。
返回值: 成功则返回实际传送出去的字符数,失败返回-1,错误原因存于
errno 中
6. recv: 从一个套接口接收数据。
原型:int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);
参数:s :一个标识已连接套接口的描述字。
buf :用于接收数据的缓冲区。
len :缓冲区长度。
flags :指定调用方式。
返回值: 若无错误发生,recv()返回读入的字节数。如果连接已中止,返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
7. sendto :将指定字节数的数据发送到指定的终结点。
原型:typedef int (_stdcall * SendTo) (SOCKET sSocket, const char * lpBuffer, DWORD dwLength,int dwFlags,const sockaddr * sinTo, nt dwToLength);
参数: s 套接字
buff 待发送数据的缓冲区
size 缓冲区长度
Flags 调用方式标志位, 一般为0, 改变Flags ,将会改变Sendto 发送的形式 addr (可选)指针,指向目的套接字的地址
len addr所指地址的长度
返回值: 实际发送数据的长度。
8. recvfrom:经socket 接收数据
原型:ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);
参数: s :标识一个已连接套接口的描述字。
buf :接收数据缓冲区。
len :缓冲区长度。
flags :调用操作方式。
from :(可选)指针,指向装有源地址的缓冲区。
fromlen :(可选)指针,指向from 缓冲区长度值。
返回值: 成功则返回接收到的字符数, 失败返回-1.
9. connect:建立socket 连线
原型:int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);
参数:
参数一:套接字描述符
参数二:指向数据机构sockaddr 的指针,其中包括目的端口和IP 地址
参数三:参数二sockaddr 的长度,可以通过sizeof (struct sockaddr)获得 返回值: 成功则返回0,失败返回-1,错误码GetLastError()。
10. accept :在一个套接口接受一个连接。
原型: SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr, int FAR* addrlen);
参数: s :套接口描述字,该套接口在listen()后监听连接。 addr :(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr 参数的实际格式由套接口创建时所产生的地址族确定。 addrlen :(可选)指针,指向存有addr 地址长度的整形数。
返回值:成功返回一个新的套接字描述符,失败返回-1。
11. listen:将 Socket 置于侦听状态。
原型:int PASCAL FAR listen( SOCKET s, int backlog);
参数:
S :用于标识一个已捆绑未连接套接口的描述字。
backlog :等待连接队列的最大长度。
返回值: 如无错误发生,listen()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
12. Bind :将套接字绑定到一个已知的地址上。
原型:int bind(int socket, const struct sockaddr *address, socklen_t
address_len);
参数:
socket :是一个套接字。
address :是一个sockaddr 结构指针,该结构中包含了要结合的地址和端口号。 address_len:确定address 缓冲区的长度。
返回值: 如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
13. inet_addr:将一个点分十进制的IP 转换成一个长整数型数INET_ADDR()。
原型:in_addr_t inet_addr(const char *cp);
参数:字符串,一个点分十进制的IP 地址
返回值:如果正确执行将返回一个无符号长整数型数。如果传入的字符串不是一个合法的IP 地址,将返回INADDR_NONE。
14. gethostbyname :返回对应于给定主机名的主机信息。
原型:struct hostent FAR *PASCAL FAR gethostbyname(const char FAR * name);
参数:字符串(主机名)
返回值: 如果没有错误发生,gethostbyname()返回如上所述的一个指向
hostent 结构的指针,否则,返回一个空指针。应用程序可以通过
WSAGetLastError()来得到一个特定的错误代码。
15. select :确定一个或多个套接字的状态。
原型:int select(int nfds,fd_set FAR* readfds, fd_set FAR*writefds, fd_set FAR*exceptfds,conset struct timeval FAR* timeout);
参数:
参数一:为了保持与早期的Berkeley 套接字应用程序兼容,一般忽略它,置为0.
参数二:用于检查可读性,
参数三:用于检查可写性,
参数四:用于检查带外数据,
参数五:一个指向timeval 结构的指针,用于决定select 等待I/o的最长时间。如果为空将一直等待。
返回值: >0:就绪描述字的正数目 -1:出错 0 :超时
16. htons :将主机的无符号短整形数转换成网络字节顺序。
原型:u_short PASCAL FAR htons( u_short hostshort);
参数:hostshort :主机字节顺序表达的16位数。
返回值: 返回一个网络字节顺序的值。
17. htonl:将主机的无符号长整形数转换成网络字节顺序。
原型:uint32_t htonl(uint32_t hostlong);
参数:hostlong :主机字节顺序表达的32位数。
返回值: 返回一个网络字节顺序的值。
18. ntohs :将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
原型:uint16_t ntohs(uint16_t netshort);
参数:netshort :一个以网络字节顺序表达的16位数。
返回值: 返回一个以主机字节顺序表达的数。
19. ioctlsocket :
原型:int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp); 参数:
s :一个标识套接口的描述字。
cmd:对套接口s 的操作命令。
argp :指向cmd 命令所带参数的指针。
返回值: 成功后,ioctlsocket()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
20. getsockopt :获取一个套接口选项。
原型:int getsockopt(int sockfd, int level, int optname, void *optval,
socklen_t *optlen);
参数:
sockfd :一个标识套接口的描述字。
level :选项定义的层次。支持的层次仅有SOL_SOCKET和IPPROTO_TCP。 optname :需获取的套接口选项。
optval :指针,指向存放所获得选项值的缓冲区。
optlen :指针,指向optval 缓冲区的长度值。
返回值: 若无错误发生,getsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
21. setsockopt: 设置套接口的选项。
原型:int PASCAL FAR setsockopt( SOCKET s, int level, int optname, const char FAR *optval, int optlen);
参数:
s :标识一个套接口的描述字。
level :选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。 optname :需设置的选项。
optval :指针,指向存放选项值的缓冲区。
optlen :optval 缓冲区长度。
返回值: 若无错误发生,setsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
三、 Winsock 及相关的函数
1. select 及相关宏(FD_ZERO:FD_SET:FD_ISSET:FD_CLR)
2. WSAAsyncSelect
3. WSAEventSelect :
4. WSACreateEvent :
5. WSAResetEvent :
6. WSACloseEvent :
7. WSAWaitForMultipleEvents :
8. WSAEnumNetworkEvents
以下只需了解:
9. _beginthread:
10. WaitForMultipleObjects :
11. WaitForSingleObject :
12. CreateMutex :
13. ReleaseMutex :
14. CloseHandle :
15. timeSetEvent:
16. SetTimer