zoukankan      html  css  js  c++  java
  • windows之socket编程示例

    1. tcp服务器端

    #include "stdafx.h"
    
    #include <WINSOCK2.H>
    #include <windows.h>
    #include <iostream>
    #include <string>
    
    #pragma     comment(lib, "ws2_32.lib ") 
    
    using namespace std;
    
    
    DWORD WINAPI ClientThread(LPVOID sockCliet);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        
        // 0 --- 加载套接字库
        WSAData wsaData;
        WSAStartup(MAKEWORD(2,2), &wsaData);
    
        // 1 --- 创建套接字
        SOCKET serSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
        // 2 --- 绑定套接字
        SOCKADDR_IN addrService;
        addrService.sin_family = AF_INET;
        addrService.sin_addr.s_addr = inet_addr("127.0.0.1");
        addrService.sin_port = htons(6000);
        bind(serSock, (sockaddr *)&addrService, sizeof(addrService));
        
        // 3 --- 指定最大同时连接数,开始监听
        listen(serSock, 10);
    
    
        // 4 --- 接受新的连接,创建线程处理本次连接
        while (1)
        {
            SOCKADDR_IN addrClient;
            int n = sizeof(addrClient);
            SOCKET newSock = accept(serSock, (sockaddr*)&addrClient, &n);    // newSock应该在子线程中关闭
            if (newSock != INVALID_SOCKET)
            {
                /*
                 5 --- 利用返回的套接字和客户端进行通信
                 6 --- 关闭套接字
                 这两步都在子线程中进行
                */
                HANDLE hThread = CreateThread(NULL, 0, ClientThread, (LPVOID)newSock, 0, NULL); 
                CloseHandle(hThread);    // 减小引用计数,并不会关闭线程,线程创建时,引用计数为2
            }
            else
            {
                break;
            }
        }
        
        // 7 --- 关闭套接字
        closesocket(serSock);
        
        // 8 --- 关闭加载的套接字库
        WSACleanup(); 
        return 0;
    }
    
    /****************************
        和客户端进行通信的子进程
    *****************************/
    
    DWORD WINAPI ClientThread(LPVOID sockClient) 
    {
        SOCKET  sock = (SOCKET)sockClient;
        char buffer[100] = {0};
        
        while (1)
        {
            int recvLen = recv(sock, buffer, 100, 0);
            if ( 0 == recvLen)    break;
            cout << "message from client: " << buffer << endl;
            //send(sock, "welcome.", strlen("welcome."), 0);
        }
    
        closesocket(sock);
    
        return 0;
    }

    2. tcp客户端

    #include "stdafx.h"
    
    #include <WINSOCK2.H>
    #include <windows.h>
    #include <iostream>
    #include <string>
    
    #pragma     comment(lib, "ws2_32.lib ") 
    
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        // 0 --- 加载套接字库
        WSAData wsaData;
        WSAStartup(MAKEWORD(2, 2), &wsaData);
        
        // 1 --- 创建套接字
        SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    
        // 2 --- 绑定套接字
        sockaddr_in serverAddr;
        serverAddr.sin_family = AF_INET;
        serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
        serverAddr.sin_port = htons(6000);
    
        // 3 --- 向服务器发出连接请求
        connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr));
    
        // 4 --- 和服务器端进行通信(send/recv)
        while (1)
        {
            Sleep(10000);
            send(clientSocket, "welcome.", strlen("welcome."), 0);
        }
    
        // 5 --- 关闭套接字
        closesocket(clientSocket);
    
        // 6 --- 关闭加载的套接字库
        WSACleanup(); 
    
        return 0;
    }
  • 相关阅读:
    什么是webview
    juqery.fn.extend和jquery.extend
    LeetCode
    5. Longest Palindromic Substring
    42. Trapping Rain Water
    11. Container With Most Water
    621. Task Scheduler
    49. Group Anagrams
    739. Daily Temperatures
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/wangzhijun/p/3770872.html
Copyright © 2011-2022 走看看