초식 Socket 프로그래밍 - 유동식 플러그인 기반의 다중 스레드 병발 서버 리셋 프로그램 설계

실험 3. 유동식 플러그인 기반의 다중 스레드 병발 서버 리셋 프로그램 설계


0x00 실험 내용


실험2의 서버를 병발 서버로 바꾸다.

0x01 구현 프로세스


실현 방법


이것은 실험2의 코드와 일부분만 다르다. 서버에 라인을 하나 열어 현재 고객을 위해 단독으로 서비스를 제공하면 된다.여기는 사용합니다pthread.h 라인을 만드는 것을 실현합니다.

공용 함수 중 수정 부분

// comm.h
//  
#include 
void *asyncTcpEchoServer(LPVOID pParam)
{
    int sock_res;
    char recv_data[MAXLINE];

    //  
    SOCKET sock_conn = *((SOCKET *)pParam);
    do
    {
        memset(recv_data, 0, MAXLINE);

        //  
        sock_res = recv(sock_conn, recv_data, MAXLINE, 0);
        if (sock_res > 0)
        {
            cout << "The Data Received From Client Is:" << recv_data << endl;

            //  
            sock_res = send(sock_conn, recv_data, sock_res, 0);
            if (sock_res == SOCKET_ERROR)
            {
                cout << WSAGetLastError() << "Send Error!" << endl;
                sock_res = -1;
            }
            else
            {
                cout << "The Data Sent From Server Is:" << recv_data << endl;
            }
        }
        else
        {
            if (sock_res == 0)
            {
                cout << "Client is closed!" << endl;
            }
            else
            {
                cout << WSAGetLastError() << "Recv Error!" << endl;
                sock_res = -1;
            }
            break;
        }
    } while (sock_res > 0);
    if (sock_res == -1)
    {
        cout << "Disconnected or Sth. Error" << endl;
    }
    return nullptr;
}

서버 측

// server.cpp
#include "comm.h"

int main(int argc, char *argv[])
{
    int res = -1;
    SOCKET sock_conn;
    SOCKET sock_listen;
    pthread_t pThread;
    char buff[MAXLINE]; // 

    //  
    res = startUp();
    if (res == -1) return -1;

    // 
    sock_listen = tcpServer(SEVER_PORT);
    if (sock_listen == -1) return -1;

    cout << "Server Start!" << endl;

    while (true)
    {
        // , sock_conn
        sock_conn = accept(sock_listen, nullptr, nullptr);

        if (sock_conn != INVALID_SOCKET)
        {
            cout << "Conn Success!" << endl;
            //  
            pthread_create(&pThread, nullptr, asyncTcpEchoServer, &sock_conn);
        }
        else
        {
            cout << WSAGetLastError() << "Accept Error!" << endl;
            closeConn(sock_listen);
            return -1;
        }
    }

    //  
    closeConn(sock_listen);
    return 0;
}

클라이언트 측은 변경할 필요가 없다


부: 일부 상황에서 select를 사용하여 병발을 실현할 수 있으며, select로 일부 장면에서 라인 팽창 문제를 효과적으로 해결할 수 있다.

좋은 웹페이지 즐겨찾기