主要步骤:
1.加载套接字库
2.创建套接字
3.绑定套接字(与端口绑定)
4.发送或等待接收数据
5.关闭套接字
注意:
如果要同时进行收发操作时,收的时候可以按照默认的套接字使用(即接收任意IP发送的数据),但是发送时要注意,如果是发送给指定的IP,需要重新创建套接字的对象,并把指定IP进行赋值,其具体如下:
SOCKET sock0 = socket(AF_INET,SOCK_DGRAM,0) //如果已经创建了,就可以不要这句,直接拿创建的就行,下面为需要
//修改的部分
SOCKADDR_IN addrNew; //此处对象名字可以随便改
addrNew.sin_addr.S_un.S_addr = inet_addr("192.168.0.10"); //这里输入该IP地址
addrNew.sin_family = AF_INET; //这里是地址族
addrNew.sin_port = htons(6000); //这里是端口号
如果绑定了就不用再绑定了
此外接收数据时,发送方的IP地址会存储在addrNew.sin_addr中,可以用以下的语句,将其转换为string类型
string ip = inet_ntoa(addrNew.sin_addr);
UDP的服务端
#include <Winsock2.h>
#include <iostream>
#include <stdio.h>
using namespace std;
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD ( 1, 1);
err = WSAStartup( wVersionRequested, &wsaData);
if( err != 0 )
{
return;
}
if( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1)
{
WSACleanup();
return;
}
//创建用于监听的套接字
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0); //TCP 第二个参数用SOCK_STREAM
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));
//等待并接受数据
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
cout<<recvBuf<<endl;
//关闭套接字
closesocket(sockSrv);
WSACleanup();
getchar();
}
UDP的客户端
#include <Winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD ( 1, 1);
err = WSAStartup( wVersionRequested, &wsaData);
if( err != 0 )
{
return;
}
if( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1)
{
WSACleanup();
return;
}
//创建套接字
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.102");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
//发送数据
sendto(sockClient,"Hello",strlen("Hello")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//关闭套接字
closesocket(sockClient);
WSACleanup();
}