zoukankan      html  css  js  c++  java
  • Socket 连接简易编程

    客户端:

    #include <iostream>
    #include <winsock2.h>
    
    using namespace std;
    
    #pragma  comment (lib, "ws2_32.lib")
    
    #define PORT 4000
    #define IP_ADDRESS "127.0.0.1"
    
    int main(int agrc, char * agrv[])
    {
        WSADATA ws;
        SOCKET ClientSocket;
        struct sockaddr_in ServerAddr;
        int Ret = 0;
        int AddrLen = 0;
        HANDLE hTread = NULL;
        char SendBuffer[MAX_PATH];
    
        int errorcode = 0;
    
        //Init Window Socket
        if ((errorcode = WSAStartup(MAKEWORD(2, 2), &ws)) != 0)
        {
            cout << "Init Windows Socket Failed::" << errorcode << endl;
            return -1;
        }
    
        // Create Socket 
        ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (ClientSocket == INVALID_SOCKET)
        {
            cout << "Create Socket Failed::" << WSAGetLastError() << endl;
            return -1;
        }
        ServerAddr.sin_family = AF_INET;
        ServerAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);
        ServerAddr.sin_port = htons(PORT);
        memset(ServerAddr.sin_zero, 0x00, 8);
    
        // connect
        Ret = connect(ClientSocket, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr));
        if (Ret == SOCKET_ERROR)
        {
            cout << "Connect Error::" << WSAGetLastError() << endl;
            return -1;
        }else{
            cout << "连接成功!!" << endl;
        }
    
        while (true)
        {
            cin.getline(SendBuffer, sizeof(SendBuffer));
            Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);
            if (Ret == SOCKET_ERROR)
            {
                cout << "Sentd Info Error::" << GetLastError() << endl;
                break;
            }
        }
    
        closesocket(ClientSocket);
        WSACleanup();
        return 0;
    }

    服务端:

    #include <iostream>
    #include <WinSock2.h>
    
    using namespace std;
    
    #pragma comment (lib, "ws2_32.lib")
    
    #define PORT 4000
    #define IP_ADDREESS "127.0.0.1"
    
    int main(int agrc, char* argc[])
    {
        WSADATA ws;  // 之后储存WSAStartUP返回 的数据, 全称:Windows Socker API Data
        SOCKET ServerSocket = 0, ClientSocket = 0;
        struct sockaddr_in LocalAddr, ClientAddr;
        int errorcode;
        int Ret = 0;
        int AddrLen = 0;
        HANDLE hThread = NULL;
    
    
        //Init Windwos Socket
        if ((errorcode = WSAStartup(MAKEWORD(2, 2), &ws)) != 0)
        {
            cout << "Create Socket Failed:" << errorcode << endl;
            return -1;
        }
    
        // CreateSocket 
        ServerSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (ServerSocket == INVALID_SOCKET)
        {
            cout << "Create Socket Failed::" << WSAGetLastError() << endl;
            return -1;
        }
    
        LocalAddr.sin_family = AF_INET;
        LocalAddr.sin_addr.s_addr = inet_addr(IP_ADDREESS);  //将ip 127.0.0.1 转换成网络字节序 
        LocalAddr.sin_port = htons(PORT);       // 转换为网络字节序
        memset(LocalAddr.sin_zero, 0x00, 8);
    
        //Bind Socket
        Ret = bind(ServerSocket,(struct sockaddr*)&LocalAddr, sizeof(LocalAddr));
        if (Ret != 0)
        {
            cout << "Bind Socket Failded::" << WSAGetLastError() << endl;
            return -1;
        }
    
        // listen
        Ret = listen(ServerSocket, 10);
        if(Ret != 0)
        {
            cout << "Listen Socket Failed::" << WSAGetLastError() << endl;
            return -1;
        }
    
        cout << " 服务端已经启动!" << endl;
    
        while (true)
        {
            AddrLen = sizeof(ClientAddr);
            ClientSocket = accept(ServerSocket, (struct sockaddr*)&ClientAddr, &AddrLen);
    
            if (ClientSocket == INVALID_SOCKET)
            {
                cout << "Accept Failed::" << WSAGetLastError() << endl;
                break;
            }
    
            char RecvBuffer[MAX_PATH];
            while (true)
            {
                memset(RecvBuffer, 0x00, sizeof(RecvBuffer));
                // 接收数据
                // recv函数返回实际copy的字节数;
                //  copy时出错,返回SOCKET_ERROR;等待协议接收数据时网络中断,返回0。
                Ret = recv(ClientSocket, RecvBuffer, MAX_PATH, 0);
                if (Ret == 0 || Ret == SOCKET_ERROR)
                {
    
                    cout << "Recv Failed::" << WSAGetLastError() << endl;
                    break;
                }
                cout << "接收到的客户信息为:" << RecvBuffer << endl;
            }
    
        }
        closesocket(ServerSocket);
        closesocket(ClientSocket);
        WSACleanup();
        return 0;
    }



    AF_INET 与 AF_INET6
    AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的;而 AF_UNIX 则是 Unix 系统本地通信。

    选择 AF_INET 的目的就是使用 IPv4 进行通信。因为 IPv4 使用 32 位地址,相比 IPv6 的 128 位来说,计算更快,便于用于局域网通信。

    而且 AF_INET 相比 AF_UNIX 更具通用性,因为 Windows 上有 AF_INET 而没有 AF_UN

  • 相关阅读:
    解决hung_task_timeout_secs问题【方法待校验】
    C++面向对象程序设计 学习心得
    试水训练1
    并查集
    ACM儿童节热身训练
    图论部分学习小结
    ACM儿童节热身训练
    堆及其应用学习小结
    ACM本周小结
    POJ-3273-Monthly Expense
  • 原文地址:https://www.cnblogs.com/laohaozi/p/8266543.html
Copyright © 2011-2022 走看看