zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/acmLLF/p/14738178.html
Copyright © 2011-2022 走看看