socket udp 服务端 客户端

 

 

 

 

 

tcp_server.cpp

复制代码
#include <WinSock2.h>
#include <iostream>


using namespace std;

#pragma comment(lib,"ws2_32.lib")


int main() {

    //初始化winsock 环境
    WSADATA wd;
    ;
    if (WSAStartup(MAKEWORD(2, 2), &wd) != 0) {

        cout << "WSAStartup error:" << GetLastError() << endl;
        return 0;
    }

    //1,创建UDP数据报 套接字

    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    //2,绑定到ip地址和端口
    sockaddr_in addr;
    //网络字节序
    addr.sin_port = htons(8000);
    //addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_family = AF_INET;

    int len = sizeof(sockaddr);
    if (bind(s, (sockaddr*)&addr, len) == SOCKET_ERROR) {

        cout << "bind error:" << GetLastError() << endl;
        return 0;
    }


    int nNetTimeout = 5000;
    //接收时限
    if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char*)&nNetTimeout, sizeof(int)) == SOCKET_ERROR) {
        cout << "setsockopt error:" << GetLastError() << endl;
        return 0;
    }    




    //3 接受或发送数据
    int ret = 0;
    do {

        //接收 客户端地址
        sockaddr_in addrClient;
        memset(&addrClient, 0, sizeof(addrClient));
        //要赋值结构体的长度
        int len = sizeof(sockaddr);

        char buf[100] = { 0 };

        //默认是阻塞的,没有数据过来 会一直等待
        ret = recvfrom(s, buf, 100, 0, (sockaddr*)&addrClient, &len);
        cout << "recvfrom " << len << ":" << buf << endl;

        ret = sendto(s, "i am server!", strlen("i am server!"), 0, (sockaddr*)&addrClient, len);

    } while (ret != SOCKET_ERROR && ret != 0);


    //4 关闭套接字
    closesocket(s);

    //清理winsock2环境
    WSACleanup();

    return 0;


    //netstat -ao
}
复制代码

 

 

 

 

 

 

tcp_client.cpp

复制代码
#include <WinSock2.h>
#include <iostream>


using namespace std;

#pragma comment(lib,"ws2_32.lib")


int main() {

    //初始化winsock 环境
    WSADATA wd;
    ;
    if (WSAStartup(MAKEWORD(2, 2), &wd) != 0) {

        cout << "WSAStartup error:" << GetLastError() << endl;
        return 0;
    }


    //创建数据报socket
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET) {
        cout << "socket error:" << GetLastError() << endl;
        return 0;
    }

    //服务端的地址
    sockaddr_in addr;
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    addr.sin_port = htons(8000);
    addr.sin_family = AF_INET;

    int len = sizeof(sockaddr_in);
    int ret = 0;
    do {
        //2, 可以sendto发送 和 recvfrom接受

        ret = sendto(s, "i am client!", strlen("i am client!"), 0, (sockaddr*)&addr, len);
        char buf[100] = { 0 };
        ret = recvfrom(s, buf, 100, 0, NULL, NULL);
        cout << "recvfrom" << ret << ":" << buf << endl;

        Sleep(1000);

    } while (ret != SOCKET_ERROR && ret != 0);


    //3关闭套接字
    closesocket(s);

    //清理winsock2环境
    WSACleanup();

    return 0;


    //netstat -ao
}
复制代码

 

posted @   AngDH  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2023-07-20 制作debugger
2020-07-20 jQuery隐式迭代
2020-07-20 jQuery选择器
2020-07-20 jQuery 与dom对象的转换
点击右上角即可分享
微信分享提示