Winsock是处理网络的Windows api,使用前先包含头文件Winsock2.h以及导入静态库Ws2_32.lib
#include<Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
如果要包含Windows.h,则Windows.h要包含在Winsock2.h下方
然后需要初始化winsock库
int WSAStartup(
__in WORD wVersionRequested, //应用程序支持的最高WinSock库版本
__out LPWSADATA lpWSAData //dll库详细信息
);
WinSock库使用完毕后需要释放:
int WSACleanup(void);
udp服务端编写:
1.创建套接字:
SOCKET WSAAPI socket(
__in int af,
__in int type,
__in int protocol
);
函数成功返回套接字句柄,失败返回 INVALID_SOCKET
第一个参数表示地址族,一般用AF_INET(IPV4)
第二个参数指定套接字的类型,SOCK_STREAM是流套接字,用于TCP,SOCK_DGRAM是数据报套接字,用于UDP
第三个参数表示协议类型,如下:
最后使用完毕记得关闭句柄
int closesocket(
__in SOCKET s
);
2.绑定端口:
int bind(
__in SOCKET s, //套接字句柄
__in const struct sockaddr* name, //要关联的本地地址
__in int namelen //地址长度
);
该函数用于将套接字和本地地址关联起来,第struct sockaddr { ushort sa_family; char sa_data[14]; };
二个参数是一个结构体指针,指向如下结构体:
struct sockaddr {
ushort sa_family; //协议族,与af参数相同
char sa_data[14]; //端口(2字节)+地址(4字节)
};
或
struct sockaddr_in {
short sin_family; //协议族
u_short sin_port; //端口号
struct in_addr sin_addr; //ip
char sin_zero[8]; //保留
};
ip地址需要填uint32_t形式,也就是一串16进制数,可以使用inet_addr函数将ip转换成长整形,如果不关心使用的地址,可以填INADDR_ANY(相当于0.0.0.0),如果想让系统分配端口号,则端口号可以填0,操作系统会在1024-5000之间选一个端口号,注意ip地址和端口号填写的字节顺序必须是网络字节顺序,所以需要如下函数转换:
u_short htons(
//端口使用该函数转换
__in u_short hostshort
);
u_long htonl(
//ip使用该函数转换
__in u_long hostlong
);
int inet_pton(
int af, //地址族
const char *src, //ip
void *dst //接收一个in_addr结构体
);
3.接受数据:
int recvfrom(
__in SOCKET s,
__out char* buf, //缓冲区
__in int len, //缓冲区大小
__in int flags, //linux使用,windows填0
__out struct sockaddr* from, //传出参数,源地址
__inout_opt int* fromlen //from参数大小
);
如果客户端没有发送数据,该函数会一直阻塞
客户端编写:
1.创建套接字,同上
2.发送数据\接收数据
由于udp不需要建立连接,所以直接使用如下api发送数据:
int sendto(
__in SOCKET s,
__in const char* buf,
__in int len,
__in int flags,
__in const struct sockaddr* to, //服务器ip和端口
__in int tolen
);
以上是创建udp服务端和客户端大致步骤,最后要记得释放句柄,另外如果需要与外网通信,需要做端口映射或内网穿透
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)