TCP部分
头文件Winsock32.h
库文件ws2_32.lib
(注:以下在服务器和客户端都能发送和接收)
服务器:
WSAData wsaData;
int error;
error = WSAStartup( MAKEWORD( 2, 2 ), &wsaData );
然后判断error值!=,返回;
然后判断是否被DLL支持
socket(,,)
第一个参数必须:AF_INET,表示地址协议族
第二个参数:a.SOCK_DGRAM,b.SOCK_STREAM. a是UDP类型,b是TCP类型
第三个参数:最好为0,他会根据地址类型和套接字类别,自动为你选择一个合适的协议
调用成功则返回一个SOCK类型的数据类型描述符,如果失败,这个就会返回一个INVALID_SOCKET,错误信息可以通过WSAGetLastError函数返回。
bind(,,)
第一个参数为要绑定的socket.
第二个参数指定该套接字的本地地址信息,是指向sockaddr结构的指针变量,对于不同协议不同(所以我们要用到第三个参数sizeof(sockddr)),在TCP/IP协议中,我们可以用socketaddr_in结构代替sockaddr。
struct socketaddr_in
{
short sin_family;//这个固定为AF_INET,
unsigned short sin_port;//端口号,注意,这里必须用网络字节序,调用函数htons函数
struct in_addr sin_addr;//IP地址,如果指定为INADDR_ANY,则允许套接字向任何分配给本机的IP地址发送或者接收数据,这对于有多个网卡的机器来说,就简化了程序的编写,如果只想让一个IP地址接收数据,则必须指定具体某个IP,这可以用inet_addr()函数,注意,这里也必须用网络字节序,调用函数htonl函数
char sin_zero[8];//只是个填充,以保证socketaddr_in与sockaddr长度一样
}
bind()函数调用成功返回0,失败就会返回一个SOCKET_ERROR,同样的错误信息可以通过WSAGetLastError函数返回。
listen(,)
第一个参数为套接字
第二个参数:等待连接最长请求队列
在死循环里调用accept(,,) //等待客户端连接
第一个参数为套接字
第二个参数为客户端的IP
第三个参数地址结构的长度,必须有一个初始值,可以用sizeof(SOCKADDR)
返回一个SOCKET
send(,,,)
第一个参数为套接字(accept返回值)
第二个参数包含被传送的数据的buffer
第三个参数buffer数据的长度
第四个参数flag,影响send的行为,设为0
recv(,,,)
第一个参数为套接字(accept返回值)
第二个参数包含被接收的数据的buffer
第三个参数buffer数据的长度
第四个参数flag,影响recv的行为,设为0
最后closesocket().
客户端:
WSAStartup方法调用,建立一个socket,这与服务器一样
connect(,,)
第一个参数为套接字
第二个参数地址结构体信息,与服务器端bind函数类似
第三个参数地址结构长度
recv(,,,)
与服务器端recv函数类似
send()
与服务器端send函数类似
closesocket
UDP部分
头文件Winsock32.h
库文件ws2_32.lib
服务器:
WSAStartup方法调用,建立一个socket,这与TCP服务器类似(第二个参数改为SOCK_DGRAM)
bind()一样
recvfrom(,,,,,)
第一个参数为socket
第二个参数buf数组
第三个参数buf的长度
第四个参数flag,设为0,
第五个参数目的地址结构的指针(out)
第六个参数整形的指针,返回地址结构的大小,(in,out)
closesocket()
WSACleanup()
客户端:
WSAStartup方法调用,建立一个socket
sendto(,,,,)
第一个参数为socket
第二个参数buf数组
第三个参数buf的长度
第四个参数flag,设为0,
第五个参数目的地址结构的指针(out)
第六个参数地址结构体的长度,(in,out)
closesocket()
WSACleanup()