int WSAStartup(
WORD wVersionRequired,
[out] LPWSADATA lpWSAData
);
socket(
_In_ int af,
_In_ int type,
_In_ int protocol
);
int sendto(
[in] SOCKET s,//标识(可能连接的)套接字的描述符。
[in] const char *buf,//指向包含要传输的数据的缓冲区的指针。
[in] int len,//buf参数指向的数据的长度(以字节为单位) 。
[in] int flags,//一组指定调用方式的标志。
[in] const sockaddr *to,//指向包含目标套接字地址的sockaddr结构的可选指针 。
[in] int tolen//to参数指向的地址的大小(以字节为单位)。
);
int recvfrom(
[in] SOCKET s, //标识绑定套接字的描述符。
[out] char *buf,//传入数据的缓冲区。
[in] int len,//buf参数指向的缓冲区的长度(以字节为单位)。
[in] int flags,//一组选项修改函数调用的行为,超出为关联套接字指定的选项。有关详细信息,请参阅下面的备注。
[out] sockaddr *from,//指向sockaddr结构中的缓冲区的可选指针,该 结构将在返回时保存源地址。
[in, out, optional] int *fromlen//指向from参数指向的缓冲区大小的可选指针,以字节为单位。
);
调用WSACleanup释放所有由Winsock分配的资源。每次调用WSAStartup后都应该调用WSACleanup。
int PASCAL FAR WSACleanup(void);
Winsock中通过SOCKADDR_IN结构体指定IP地址和端口号。
struct sockaddr_in {
short sin_family; // 设定为AF_INET, 表示正使用IP地址族
u_short sin_port; // 端口号
struct in_addr sin_addr; // 把IP地址作为一个4字节变量存储
char sin_zero[8];
};
主机字节顺序(little endian) --> 网络字节顺序 | u_long htonl ( _In_ u_long hostlong); u_short htons (_In_ u_short hostshort); |
网络字节顺序(big endian) --> 主机字节顺序 | u_long ntohl (_In_ u_long netlong); u_short ntohs (_In_ u_short netshort); |
inet_addr(char* cp) 转化成u_long为网络字节地址。
ps:这儿的cp是十分点制的IP地址
UDP如何连接:
操作步骤上,先用socket / WSASocket创建套接字;再把该套接字和准备接收数据的接口绑定在一起(通过bind函数);然后只需等待收发数据。(不必调用listen和connect)。调用recvfrom函数: