计算机网络 UDP小例子

服务端

加载库        ws2_32.lib、WSAStartup()

//1.加载库
int err = 0;
WORD version = MAKEWORD(2,2);
WSADATA wsaData;
err = WSAStartup(version,&wsaData);
//判断返回值
if (err!=0) {
    cout << "WSAStartup error" << endl;
    return 1;
}
//判断加载的版本是否是2.2版本    HIBYTE高字节        LOBYTE低字节
if (2!=HIBYTE(wsaData.wVersion)||2!=LOBYTE(wsaData.wVersion)) {
    cout << "WSAStartup Version error" << endl;
    WSACleanup();//卸载库
    return 1;
}
else {
    cout << "WSAStartup success" << endl;

创建套接字        socket()

//2.创建套接字    AF_INET ipv4
SOCKET sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
    cout << "socket error : "<<WSAGetLastError() << endl; 
    WSACleanup();//卸载库
    return 1;
}
else {
    cout << "socket success" << endl;
}

绑定IP        bind()

int bind( [in] SOCKET s, const sockaddr *addr, [in] int namelen );

//3.绑定ip,是在操作系统里面注册端口和ip地址,也就是说当操作系统收到发给某个端口号和ip地址的数据,就是咱们程序要接受的
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(456789);    //转换成网络字节序也就是大端存储 , 本机是小端存储
addr.sin_addr.S_un.S_addr = INADDR_ANY;        //绑定所有网卡
err=bind(sock, (sockaddr*)&addr, sizeof(addr));
if (err == SOCKET_ERROR) {
    cout << "bind error : " << WSAGetLastError() << endl;
    closesocket(sock);//关闭套接字
    WSACleanup();//卸载库
    return 1;
}
else {
    cout << "bind success" << endl;
}

接收消息、回复消息        recvfrom()、sendto()

recvfrom

int recvfrom(

        [in] SOCKET s,

        [out] char *buf,

        [in] int len,

        [in] int flags,

        [out] sockaddr *from,        //输出参数

        [in, out, optional] int *fromlen

);

 sendto

int sendto(

        [in] SOCKET s,

        [in] const char *buf,

        [in] int len, [in] int flags,

        [in] const sockaddr *to,        //输入参数

        [in] int tolen

);

int nRecvNum = 0;
int nSendNum = 0;
char recvBuf[1024] = "";
sockaddr_in addrClient;
int addrClientSize = sizeof(addrClient);
while (true) {
    //4.接收数据
    nRecvNum = recvfrom(sock, recvBuf,sizeof(recvBuf),0, (sockaddr*)&addrClient, &addrClientSize);
    if (nRecvNum>0) {
        //接收数据成功,打印一下接收数据内容和发送端的ip地址
        //"192.168.3.145"十进制四等分字符串类型ip地址
        //ulong类型的ip地址sockaddr_in.sin_addr.S_un.S_addr
        //从ulong类型转化成字符串类型ip地址: inet_ntoa(addrClient.sin_addr);
        //从字符串类型转化成ulong类型ip地址: inet_addr();
        cout <<""<< inet_ntoa(addrClient.sin_addr) << " say:" << recvBuf << endl;
    }
    else {
        //接收失败,打印失败日志,结束循环
        cout<<"recvfrom error:"<< WSAGetLastError() << endl;
        break;
    }
    //5.发送数据
    char msg[] = "genshin启动";
    sendto(sock,msg,sizeof(msg),0, (sockaddr*)&addrClient, addrClientSize);
    if (SOCKET_ERROR == nSendNum) {
        //发送失败,打印失败日志,结束循环
        cout<<"sendto error:"<< WSAGetLastError() << endl;
        break;
    }
}

关闭套接字卸载库        closesocket()、WSACleanup()

//6.关闭套接字,卸载库
//关闭套接字
closesocket(sock);
//卸载库
WSACleanup();

客户端

加载库        ws2_32.lib、WSAStartup()

//1.加载库
int err = 0;
WORD version = MAKEWORD(2,2);
WSADATA wsaData;
err = WSAStartup(version,&wsaData);
//判断返回值
if (err!=0) {
    cout << "WSAStartup error" << endl;
    return 1;
}
//判断加载的版本是否是2.2版本    HIBYTE高字节        LOBYTE低字节
if (2!=HIBYTE(wsaData.wVersion)||2!=LOBYTE(wsaData.wVersion)) {
    cout << "WSAStartup Version error" << endl;
    WSACleanup();//卸载库
    return 1;
}
else {
    cout << "WSAStartup success" << endl;

创建套接字        socket()

//2.创建套接字    AF_INET ipv4
SOCKET sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
    cout << "socket error : "<<WSAGetLastError() << endl; 
    WSACleanup();//卸载库
    return 1;
}
else {
    cout << "socket success" << endl;
}

发送消息、接收消息      sendto()、recvfrom()

int nRecvNum = 0;
int nSendNum = 0;
char recvBuf[1024] = "";
sockaddr_in addrClient;
addrClient.sin_family = AF_INET;
addrClient.sin_port = htons(456789);
addrClient.sin_addr.S_un.S_addr = inet_addr("192.168.0.102");
int addrClientSize = sizeof(addrClient);
while (true) {
    //3.发送数据(已知对端ip)
    char msg[] = "我超op";
    sendto(sock, msg, sizeof(msg), 0, (sockaddr*)&addrClient, addrClientSize);
    if (SOCKET_ERROR == nSendNum) {
        //发送失败,打印失败日志,结束循环
        cout << "sendto error:" << WSAGetLastError() << endl;
        break;
    }
    //4.接收数据
    nRecvNum = recvfrom(sock, recvBuf, sizeof(recvBuf), 0, NULL, NULL);
    if (nRecvNum > 0) {
        //接收数据成功,打印一下接收数据内容和发送端的ip地址    
        cout << " server say:" << recvBuf << endl;
    }
    else {
        //接收失败,打印失败日志,结束循环
        cout << "recvfrom error:" << WSAGetLastError() << endl;
        break;
    }
}

关闭套接字卸载库        closesocket()、WSACleanup()

//5.关闭套接字,卸载库
//关闭套接字
closesocket(sock);
//卸载库
WSACleanup();

测试

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值