UDP是不面向连接的通信,通信过程如下:
首先链接导入库文件,包含头文件,加载套接字库。
服务端:
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
客户端:
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
发送和接收数据:
int sendto(
SOCKET s, //发送数据的socket
const char FAR *buf, //要发送数据的buf地址
int len, //要发送数据的buf长度
int flags, //一般设置为0
const struct sockaddr FAR *to, //目的地址结构体指针
int tolen //地址结构体长度
);
int recvfrom(
SOCKET s, //接收数据socket
char FAR* buf, //保存接收数据的buf地址
int len, //保存接收数据的buf长度
int flags, //一般设置为0
struct sockaddr FAR *from, //地址结构体指针,用来保存数据发送端地址信息
int FAR *fromlen //地址结构体长度
);
服务端socket必须绑定IP端口,这样客户端socket才能知道服务端socket的IP端口从而向服务端socket发送数据。
char IPaddr[16]="127.0.0.1";
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr(IPaddr);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
int len=sizeof(SOCKADDR);
sendto(sockClient,"da
客户端socket不需要绑定IP端口,而让系统随机绑定一个端口。因为服务端socket永远不会先发数据给客户端socket,而在服务端socket recvfrom客户端发来的数据时,recvfrom函数里就有参数能保存发数据来的客户端socket的地址信息。
char pathBuf[100];
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,pathBuf,100,0,(SOCKADDR*)&addrClient,&len);
socket使用完毕后调用closesocket()函数关闭一个socket以回收资源。在程序关闭之前调用WSACleanup函数终止对套接字库的使用,注意必须在App类(应用程序类)的析构函数中调用WSACleanup函数。