以下函数根据服务器启动流程介绍的socket相关函数,后面也有客户端的socket函数。
1、函数MAKEWORD
函数:WORD MAKEDORD(BYTE bLow, BYTE bHigh)
描述:创建一个无符号16位整数。
参数:
(1)bLow: 指定新变量的低字节序
(2)bHigh: 指定变量的高字节序
返回值:一个无符号16位整形数。
2、WSAStartup
函数:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData)
描述:Windos Socket Asynchronous,Windows异步套接字的启动命令,指明socket的版本号获得特定Windows Sockets实现的细节。
参数:
(1)wVersionRequested :一个WORD(双字节)型数值,在最高版本的Windows Sockets支持调用者使用,高阶字节指定小版本(修订本)号,低位字节指定主版本号。
(2)lpWSAData 指向WSADATA数据结构的指针,用来接收Windows Sockets [1] 实现的细节。
WSADATA的两个重要字段。
wVersion: 期望调用者使用的Windows Sockets规范的版本。
wHighVersion:dll能够支持的Windows Sockets规范的版本,通常与wVersion相同。
返回值:0 成功。否则返回下列的错误代码
3、WSACleanup
函数:int PASCAL FAR WSACleanup(void)
返回值:操作成功返回值为0;否则返回值为SOCKET_ERROR,可以通过调用WSAGetLastError获取错误代码。
在一个多线程的环境下,WSACleanup()中止了Windows Sockets在所有线程上的操作.
描述:中止Winsock dll的使用。
头文件:#include <Winsock.h>
引用库:#pragma comment(lib, "ws2_32.lib")
4、socket
函数:SOCKET PASCAL FAR socket(int af,int type,int protocol)
描述:根据指定的地址、套接口类型和协议来分配一个套接口的描述字及其所用的资源。
参数:
af:一个地址描述。仅支持AF_INET格式,也就是说ARPA Internet地址格式。
名称 | 含义 | 名称 | 含义 |
PF_UNIX,PF_LOCAL | 本地通信 | PF_X25 | ITU-T X25 / ISO-8208协议 |
AF_INET,PF_INET | IPv4 Internet协议 | PF_AX25 | Amateur radio AX.25 |
PF_INET6 | IPv6 Internet协议 | PF_ATMPVC | 原始ATM PVC访问 |
PF_IPX | IPX-Novell协议 | PF_APPLETALK | Appletalk |
PF_NETLINK | 内核用户界面设备 | PF_PACKET | 底层包访问 |
type:新套接口的类型描述。
类型有:SOCK_STREAM(TCP) ,SOCK_DGRAM(UDP) ,SOCK_STREAM
protocol:套接口所用的协议,如调用者不想指定,可用0,表示缺省。
返回值:成功时返回一个标识这个套接字的文件描述符SOCKET,-1失败
5、bind
函数:int PASCAL bind(SOCKET sockfd, const struct socket FAR* my_addr, int addrlen)
描述:将一本地地址与一套接口绑定,本函数适用于未连接的数据报或流类套接字,在connect或者listen调用前使用。
socket创建套接口后,它便存在于一个名字空间中,但并未赋名。bind函数通过给一个未命名套接口分配一个名字来为套接字建立本地绑定(IP:端口)
参数:
- sockfd socket函数返回的描述符。
- my_addr:指定想要绑定的IP和端口。
- addrlen: my_addr的长度。
附加:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
6、listen
函数:int litsten(int sockfd,int backlog)
描述:创建一个套接口并监听申请的连接。
参数:
- sockfd:用于表述一个已捆绑未连接套接口的描述字。
- backlog:等待连接队列的最大长度。
返回:0,成功,-1失败。
7、accept
函数:SOCKET accept(int sockfd, struct sockaddr* addr, socklen_t *addrlen)
描述:从socket的等待连接队列中抽取一个连接,创建一个于s同类的新的套接口,并返回句柄。(sockfd = s)
如果队列中无等待连接,且套接口为阻塞方式,则accept()阻塞调用进程直至新的连接出现。如果套接口为非阻塞方式且队列中无等待连接,则accept()返回一错误代码。已接受连接的套接口不能用于接受新的连接,原套接口仍保持开放。
参数:
- sockfd:套接字描述符
- addr:指向通讯层所知的连接实体的地址。
- addrlen:输入参数,陪护addr一起使用。指向addr地址的长度:
返回:
返回连接的句柄
8、recv
函数int recv(_In_SOCKET s, _Out_char *buf, _In_int len, _In_int flags);
描述:从TCP连接的另一端接收数据。
参数:
- s:指定接收端套接字描述符。
- buf:指定存放recv函数接收的数据。
- len:指定buf的长度。
- flags:一般指定0
返回:
成功:recv函数返回其实际copy的字节数
失败:-1
备注:
如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的);
阻塞模式下,recv/recvfrom将会阻塞到缓冲区里至少有一个字节(TCP)/至少有一个完整的UDP数据报才返回,没有数据时处于休眠状态。若非阻塞,则立即返回,有数据则返回拷贝的数据大小,否则返回错误-1,置错误码为EWOULDBLOCK。
9、closesocket
函数:int PASCAL closesocket(SCOKET s)
描述:关闭一个套接口的描述字。
参数:s:一个套接口的描述字。
返回:0:成功,-1失败
10、WSACleanup
函数 int PASCAL FAR WSACleanup(void);
描述:终止winsock dll库的调用。
返回值:0成功,-1失败
客户端
11、connect
函数:int connect(SOCKET s,const struct sockaddr* name,int namelen);
描述:用于建立与指定socket对象name的连接。
参数:
(1)s:标识一个未连接的socket,存放连接成功的socket对象
(2)name:指向要连接套接字的sockaddr结构体的指针。
(3)namelen:sockaddr结构体的字节长度。
返回:0成功,-1失败
12、send()
函数:int send(SOCKET s,const char FAR *buf,int len,int flags);
描述:向已连接socket对象s发送数据。如果发送成功,返回发送数据的长度。
参数:
- s:指定发送端套接字的描述符。
- buf:存放应用程序要发送数据的缓冲区。
- len:指明实际要发送的数据的字节数。
- flags: 调用执行方式,一般置为0。
每个TCP套接口都有一个发送缓冲区,它的大小可以用SO_SNDBUF这个选项来改变。调用send函数的过程,实际是内核将用户数据拷贝至TCP套接口的发送缓冲区的过程:若len大于发送缓冲区大小,则返回-1;否则,查看缓冲区剩余空间是否容纳得下要发送的len长度,若不够,则拷贝一部分,并返回拷贝长度(指的是非阻塞send,若为阻塞send,则一定等待所有数据拷贝至缓冲区才返回,因此阻塞send返回值必定与len相等);若缓冲区满,则等待发送,有剩余空间后拷贝至缓冲区;若在拷贝过程出现错误,则返回-1。关于错误的原因,查看errno的值。
如果send在等待协议发送数据时出现网络断开的情况,则会返回-1。注意:send成功返回并不代表对方已接收到数据,如果后续的协议传输过程中出现网络错误,下一个send便会返回-1发送错误。TCP给对方的数据必须在对方给予确认时,方可删除发送缓冲区的数据。否则,会一直缓存在缓冲区直至发送成功(TCP可靠数据传输决定的)。