• socket用法


    服务器:

    #include "InitSock.h"
    #include
    #include
    using namespace std;
    CInitSock initSock; // 初始化Winsock库
    int main()
    {
    // 创建套节字
        SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    //用来指定套接字使用的地址格式,通常使用AF_INET
    //指定套接字的类型,若是SOCK_DGRAM,则用的是udp不可靠传输
    //配合type参数使用,指定使用的协议类型(当指定套接字类型后,可以设置为0,因为默认为UDP或TCP)
        if(sListen == INVALID_SOCKET)
        {
            printf("Failed socket() 
    ");
            return 0;
        }
    // 填充sockaddr_in结构 ,是个结构体
        sockaddr_in sin;
        sin.sin_family = AF_INET;
        sin.sin_port = htons(4567); //1024 ~ 49151:普通用户注册的端口号
        sin.sin_addr.S_un.S_addr = INADDR_ANY;
    // 绑定这个套节字到一个本地地址
        if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
        {
            printf("Failed bind() 
    ");
            return 0;
        }
    // 进入监听模式
    //2指的是,监听队列中允许保持的尚未处理的最大连接数
        if(::listen(sListen, 2) == SOCKET_ERROR)
        {
            printf("Failed listen() 
    ");
            return 0;
        }
    // 循环接受客户的连接请求
        sockaddr_in remoteAddr;
        int nAddrLen = sizeof(remoteAddr);
        SOCKET sClient = 0;
        char szText[] = " TCP Server Demo! 
    ";
        while(sClient==0)
        {
    // 接受一个新连接
    //((SOCKADDR*)&remoteAddr)一个指向sockaddr_in结构的指针,用于获取对方地址
            sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
            if(sClient == INVALID_SOCKET)
            {
                printf("Failed accept()");
            }
            printf("接受到一个连接:%s 
    ", inet_ntoa(remoteAddr.sin_addr));
            continue ;
        }
        while(TRUE)
        {
    // 向客户端发送数据
            gets(szText) ;
            ::send(sClient, szText, strlen(szText), 0);
    // 从客户端接收数据
            char buff[256] ;
            int nRecv = ::recv(sClient, buff, 256, 0);
            if(nRecv > 0)
            {
                buff[nRecv] = '';
                printf(" 接收到数据:%s
    ", buff);
            }
        }
    // 关闭同客户端的连接
        ::closesocket(sClient);
    // 关闭监听套节字
        ::closesocket(sListen);
        return 0;
    }

    客户端:

    #include "InitSock.h"
    #include
    #include
    using namespace std;
    CInitSock initSock; // 初始化Winsock库
    int main()
    {
    // 创建套节字
        SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if(s == INVALID_SOCKET)
        {
            printf(" Failed socket() 
    ");
            return 0;
        }
    // 也可以在这里调用bind函数绑定一个本地地址
    // 否则系统将会自动安排
    // 填写远程地址信息
        sockaddr_in servAddr;
        servAddr.sin_family = AF_INET;
        servAddr.sin_port = htons(4567);
    // 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
    // 如果你的计算机没有联网,直接使用127.0.0.1即可
        servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
        if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1)
        {
            printf(" Failed connect() 
    ");
            return 0;
        }
        char buff[256];
        char szText[256] ;
        while(TRUE)
        {
    //从服务器端接收数据
            int nRecv = ::recv(s, buff, 256, 0);
            if(nRecv > 0)
            {
                buff[nRecv] = '';
                printf("接收到数据:%s
    ", buff);
            }
    // 向服务器端发送数据
            gets(szText) ;
            szText[255] = '';
            ::send(s, szText, strlen(szText), 0) ;
        }
    // 关闭套节字
        ::closesocket(s);
        return 0;
    }
  • 相关阅读:
    智能指针之第二印象
    网易实习笔试真题C/C++
    map,hash_map和unordered_map 实现比较
    斐波那契堆(一)之 图文解析 和 C语言的实现
    二项堆(一)之 图文解析 和 C语言的实现
    寻找最小的k个数
    P、NP、NP-Complete、NP-hard问题
    网易有道笔试:求连通图的割点(关节点)
    块设备的读流程分析
    不相交集(The Disjoint Set ADT)
  • 原文地址:https://www.cnblogs.com/acmLLF/p/14738178.html
Copyright © 2020-2023  润新知