1 网络编程 API 2 3 4 int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData ); lpWSAData 是一个返回值;成功返回 0,失败返回 -1,错误代码 WSASYSNOTREADY 表示基础网络子系统没有准备好网络通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPROGRESS 表示一个阻塞的 Sockets 操作在进程中,WSAEPROCLIM 表示 Sockets 支持的任务数到达上限,WSAEFAULT 表示 lpWSAData 不是一个有效指针 5 WORD MAKEWORD( X, Y ); 获得 wVersionRequested 正确值,WinSock 库版本,高位指定副版本,低位制定主版本 6 WSAEnumProtocols(); 查询协议信息 7 int WSACleanup(void); 终止对 Windsock 库的使用;成功返回 0,失败返回错误信息 8 9 int WSAGetLastError(void); 得到最近的一次错误信息,不能返回 WSAStartup 的错误信息;声明的错误信息在 winsock1.h 和 winsock2.h 中,常见 SOCKET_ERROR,值为 -1 10 11 12 SOCKET socket( int af, int type, int protocol ); af 制定网络地址类型,常为 AF_INET;type 指定套接字类型,SOCK_STREAM 表示流套接字,SOCK_DGRAM 表示数据报套接字;protocol 指定使用的协议,默认为 TCP/IP 协议(为 0);成功返回套接字,失败返回 INVALID_SOCKET 13 int bing( SOCKET s, const struct sockaddr FAR *name, int namelen ); 失败返回 SOCKET_ERROR 错误,使用 TCP/IP 时返回 WSAEADDRINUSE 错误表示端口已经被用或处于 TIME_WAIT 状态,如果绑定一个已经绑定的套接字将返回 WASEFAULT 14 int listen( SOCKET s, int backlog ); 如果没有可用描述字时 listen 仍正常工作,直到请求队列变为空;backlog 指定等待连接的最大队列长度,使用非法值时系统会自动分配一个最接近的合法值;队列满时产生 WSAECONNREFUSED 错误;成功返回 0,错误返回 -1,常见错误信息是 WSAEINVAL 表示在监听之前未调用 bind 15 SOCKET accept( SOCKET s, struct sockaddr *addr, int *addrlen ); s 是出于监听状态的描述字;addr 是一个有效的地址,在 accpt 返回后包含客户机的 IP 地址信息;addrlen 是 addr 的长度;成功返回新的套接字 16 int connect( SOCKET s, const struct sockaddr *name, int namelen ); 失败返回 WSAEADDRNOTAVAIL,表示 name 结构中的地址域全为 0, WSAECONREFUSED 表示要连接的计算机没有监听指定端口的这一进程,WSAETIMEOUT 表示连接超时 17 18 int send( SOCKET s, const char *buf, int len, int flag ); flags 为 0 表示无特殊行为,MSG_DONTROUTE 表示要求传输层不要把它发出的数据报路由出去,MSG_OOB 表示数据应该被带外发送;成功返回发送的字节数,错误返回 -1,错误信息为 WSAECONNABORTED 表示虚拟回路由于超时或协议有错而中断时,WSAECONNRESET 表示远程主机套接字被强行或意外关闭,WSAETIMEOUT 表示由于网络故障或远程主机系统异常而引起连接中断;成功调用 send 并不意味着数据传输成功,如传送系统的缓冲区空间不够,除非套接字出于非阻塞 I/O 方式,否则 send 函数被阻塞 19 int recv( SOCKET s, char *buf, int len, int flags ); flags 为 0 表示无特殊行为,为 MSG_PEEK 表示将有用数据复制到所需缓冲区后不从系统缓冲区删除它们 20 int shutdown( SOCKET s, int how ); 中断连接,防止丢失数据,发送端通知接收端不再发送数据或接收端通知发送端不再接受数据;无论如何 shutdown 函数都不会阻塞;how 为 SD_RECEIVE 表示不再接收数据,SD_SEND 表示不再发送数据,SD_BOTH 不再接收和发送 21 int closesocket( SOCKET s ); 关闭套接字;调用关闭了的套接字会出现 WSAENOTSOCK 错误 22 23 int recvfrom( SOCKET s, char *buf, int len, int flags, struct sockaddr *from, int *fromlen ); 当函数返回时 from 中填入发送数据端的地址 24 int sendto( SOCKET s, const char *buf, int len, int flags, const struct sockaddr *to, int tolen ); to 带有接收数据的套接字目标地址信息 25 26 27 unsigned long inet_addr( const char *cp ); 将点分十进制转换为 32 位无符号长整型,同时取 IP 地址为 INADDR_ANY 以允许服务器应用监听主机上每个网络接口上的客户端活动 28 char *inet_ntoa( struct in_addr in ); 将 in_addr 结构转换到点分十进制 IP 29 u_short htons( u_short hostshort ); 30 u_long ntohs( u_long netlong ); 31 32 int gethostname( char *name, int namelen ); 将主机名存放到 name 中,以 '