Post

크롬 확장프로그램 추천


RescueTime : 시간관리 프로그램

내가 무슨프로그램에 얼마만큼 시간을 썼는지 알 수 있는 프로그램. 이것도 좋아하지만
ManicTime이 더 마음에 든다.(ManicTime은 크롬 확장 없음)



DarkReader : 브라우저 화면색 어둡게 해주는 프로그램

브라우저 바탕색을 검은색으로 설정할 수 있어서
눈이 덜 아프다. (대략 이렇게 보인다.. 약간 붉은 이유는 f.lux 때문..)

Check plus for Gmail : gmail 알람
구글 이메일이 오면 즉시 크롬에서 바로 확인할 수 있어서 유용하다.

f.lux : 블루라이트 차단
화면이 붉게 변한다. 블루라이트를 없애줘서 인데 이거 쓰고나서
장시간일해도 피로감도 없고 정신이 맑아졌다.


Post

Bitnami로 서버 접속 ( Windows )


  1. 아파치를 설치하기 위해 Bitnami( https://bitnami.com/ )를 다운받는다. MySql, PHP는 사용X
  2. 설치 확인을 위해 Go to Aplication 버튼을 클릭한다. Bitnabi 웹페이지가 잘 나온다면 성공한 것이다.
  3. Manage Servers 메뉴를 선택해 Apache Web Server를 Stop 시키면 Apache 서버가 꺼진 것이다.(웹페이지를 다시불러오면 페이지를 찾지 못했다는 창이 뜬다)D F
  4. Bitnami가 설치된 폴더로 가면( C:\Bitnami\wampstack-7.1.21-0\apache2\htdocs ) index.html 파일을 찾을 수 있다.
  5. index.html이 있는 폴더 내용을 전부 삭제 하고, 자신이 만든 html 파일을 넣으면 새로 고침 후 홈페이지가 반영된 것을 알 수 있다.
  6. 기존엔 내 컴퓨터에 html 파일을 연거지만, 5번은 웹 클라이언트가 웹 서버에 페이지를 요청을 하고, 클라이언트가 응답을 받아서 웹페이지가 나온 것이다.

댓글 달기 기능 


  1. https://disqus.com/ 사이트 접속
  2. 회원가입, 로그인 후 나오는 페이지에서 Get Started - I want to install Disqus on my site 클릭
  3. Website Name을 적고 Create Site 클릭. 그 후 무엇으로 홈페이지를 만들었는지 선택하는 화면이 나오는데 맨 밑에 'I don't see my platform...' 클릭
  4. 어떤 코드가 나옴. 그 코드를 소스코드에 넣으면 댓글 추가 완료. ( File이 아니라 웹서버에 요청해서 페이지를 열어야 한다! 파일로는 댓글이 안보인다. )

채팅 기능 추가


  1. https://www.tawk.to/ 사이트 접속
  2. 가입, 로그인 후 Dashboard 화면이 뜬다. ( https://dashboard.tawk.to/#/dashboard )
  3. 여기서 왼쪽 맨 아래에 수레바퀴 모양(설정 모양) 버튼을 클릭한다.
  4. 자신의 홈페이지 이름, 주소를 적고 완료.
  5.  Widget Code를 복사해서 웹 사이트에 추가한다. 채팅창이 추가된 것을 확인할 수 있다.(http로 열어야 한다. 파일x)
  6. 방문자가 채팅을 치면 알람소리가 들리고 Dashboard에서 알람이 뜬 것을 확인할 수 있다. 알람 뜬 아이콘을 선택 후 Join을 누르면 사용자와 채팅을 할 수 있다.


Post

HTML 기본태그


  • <strong>내용</strong> : 중요한 단어라고 설정하고, 글자를 진하게 한다. <b>는 그냥 글자만 진하게 한다.
  • <u>내용</u> : 밑줄 영어로 underline. 앞글자만 따서 <u> 태그는 글자에 밑줄을 긋는 태그이다.
  • <h1> ~ <h6> : 제목을 나타내는 태그. 1이 제일 글자 크기가 크고 6이 제일 작다.
  • <br> : 줄바꿈 태그. 닫는 태그가 없다.
  • <p>내용</p> : 단락을 가르는 태그. 웹페이지에서 단락이라는 의미를 가지기 때문에 <br>태그와 비슷하지만 <p> 태그를 쓰면 더 좋다.그리고 <p>태그는 정해진 여백크기가 있지만 style을 사용하면 여백 크기를 다르게 만들 수 있다.

ex. <p style = "margin-top:45px;">

  • <img>태그 : 이미지를 나타내는 태그. 사용 방법은 <img src = "이미지 위치" width = "100"> 이 때 src, width은 속성이다.
태그의 이름만으로는 부족할 때 태그의 속성에 정보를 준다.
  • <li>목록</li> 태그 : 목록 태그.  목록의 영어이름 list에 앞 두글자를 땄다. <ul>태그는 <li>태그로 이루어진 목록을
그룹짓는 역활을 한다. 숫자목록을 하고 싶으면 <ul>대신 <ol>태그를 사용한다.
  • <ul>태그는 Unordered List의 약자
  • <ol>태그는 OrderedList 의 약자
  • <title>타이틀</title> : 웹페이지의 제목을 명시적으로 알려줌. 검색엔진이 검색할 때 유용하게 사용된다.
  • <a> : 링크. ancher 약자. <a href = 주소></a>


GIT으로 정적 웹 호스팅하기


  1. 로그인 후 새로운 저장소를 만든 후 Upload files 버튼을 클릭해서 웹파일을 git에 올린다.
  2. Settings 클릭 후 GitHub Pages 에서 source 를 master branch로 바꾼 후 저장.
  3. Source 위에 웹 주소가 생긴다. git에서 정적웹 호스팅이 생성된 것이다. 
이제 누구나 내가 만든 웹페이지에 접근할 수 있다.
( git은 static web만 호스팅 된다고 한다. static web이란 화면 변화 없이 그대로 보여주는 웹이고, dynamic web이란 클라이언트에서 보내주는 값에 의해 화면이 바뀔 수 있는 web이다. html로만 만든 웹 클라이언트는 서버가 없어서 동적인 변화를 못주기 때문에 static web이다.) 

그 외 추천 웹호스팅 https://www.bitballoon.com/ , http://neocities.org , Google Cloud Storage , Azure Blob




Post

2018/10/04 - [Programing/Server] - IOCP window 채팅 클라이언트 소스

IOCP window 채팅 클라이언트 소스


아래는 IOCP window 채팅 클라이언트 프로젝트이다

WinChatClnt.zip

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "resource.h"
#include 

#pragma comment(lib, "ws2_32.lib")

struct SOCKDATA
{
    SOCKET hSocket;
    SOCKADDR_IN servAdr;
};

SOCKET hSocket = 0;     // 소켓. 메시지 처리에서도 사용해야되서 전역변수로 선언
HWND hMsgWnd = 0;     // 메시지 받고 나서 ui처리해야 되서 전역변수로 선언


#pragma region RegionName
#define BUF_SIZE 1024
void ErrorHandling(const char* message);
void StartServerConnect(WSADATA& wsaData, SOCKET& hSocket, SOCKADDR_IN& servAdr);       // 소켓 초기화
DWORD WINAPI ServerThreadMain(LPVOID socket);                                   // 서버와 데이터를 주고 받는 Thread

BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {
    // WM_INITDIALOG: Dialog Box 초기화 코드 작성
    return (TRUE);
}

void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify) {

    if (0 == hMsgWnd)
    {
        hMsgWnd = hWnd;
    }

    //WM_COMMAND
    switch (id) {
    case IDOK:
    {
        TCHAR buff[BUF_SIZE];
        GetDlgItemText(hWnd, IDC_CHAT_ENTER, buff, BUF_SIZE);
        char temp[BUF_SIZE];
        WideCharToMultiByte(CP_ACP, 0, buff, BUF_SIZE, temp, BUF_SIZE, NULL, NULL);
        printf("%s \n", temp);

        int len = strlen(temp);
        send(hSocket, temp, len, 0);

        memset(buff, 0, BUF_SIZE);

        // 글자 없애기
        SetDlgItemText(hWnd, IDC_CHAT_ENTER, buff);

        break;
    }
    case WM_DESTROY:
        exit(0);

        break;
    }
}

// DialogBox Procedure
INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
    case WM_INITDIALOG:
        return (SetDlgMsgResult(hWnd, uMsg, HANDLE_WM_INITDIALOG((hWnd), (wParam), (lParam), (Dlg_OnInitDialog))));

    case WM_COMMAND:
        return (SetDlgMsgResult(hWnd, uMsg, HANDLE_WM_COMMAND((hWnd), (wParam), (lParam), (Dlg_OnCommand))));
    }
    return (FALSE);
}

int APIENTRY _tWinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR    lpCmdLine,
    int       nCmdShow)
{
    WSADATA wsaData;
    SOCKADDR_IN servAdr;
    
    StartServerConnect(wsaData, hSocket, servAdr);

    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);


    // DialogBox생성 함수      
    DialogBox(hInstance,
        MAKEINTRESOURCE(CHAT_DIALOG/*DialogBox ID*/),
        NULL,
        Dlg_Proc/*DialogBox Procedure*/);

    return(0);
}

DWORD WINAPI ServerThreadMain(LPVOID data)
{
    SOCKDATA* socketInfo = (SOCKDATA*)data;
    if (NULL == socketInfo)
    {
        return 0;
    }

    if (connect(socketInfo->hSocket, (SOCKADDR*)(&socketInfo->servAdr), sizeof(socketInfo->servAdr)) == SOCKET_ERROR)
    {
        DWORD dwError = GetLastError();
        ErrorHandling("connect() error!");
    }
    else
        puts("Connected...........");

    char message[BUF_SIZE];
    memset(message, 0, BUF_SIZE);
    TCHAR uniMessage[BUF_SIZE];
    memset(uniMessage, 0, BUF_SIZE * sizeof(TCHAR));
    
    int strLen = 0;
    int readLen = 0;

    while (true)
    {
        //fputs("Input message(Q to quit): ", stdout);
        //fgets(message, BUF_SIZE, stdin);
        //if (!strcmp(message, "q\n") || !strcmp(message, "Q\n"))
        //    break;

        //strLen = strlen(message);
        //send(socketInfo->hSocket, message, strLen, 0);

        readLen = 0;
        while (1)
        {
            memset(message, 0, BUF_SIZE);
            readLen += recv(socketInfo->hSocket, &message[readLen], BUF_SIZE - 1, 0);
            if (readLen >= strLen)
                break;
        }
        strLen = readLen;
        message[strLen] = 0;

        // 유니코드로 변경
        memset(uniMessage, 0, BUF_SIZE * sizeof(TCHAR));
      

        // 유니코드 변경 전 유니코드 길이 구하기
        int nUniLen = MultiByteToWideChar(CP_ACP, 0, message, strlen(message), NULL, NULL);

        MultiByteToWideChar(CP_ACP, 0, message, strLen+1, uniMessage, nUniLen);
        

        if (0 != hMsgWnd)
        {
            //SetDlgItemText(hMsgWnd, CHAT_VIEW, uniMessage);
            SendDlgItemMessage(hMsgWnd, CHAT_VIEW, LB_GETCURSEL, 0, 0);
            SendDlgItemMessage(hMsgWnd, CHAT_VIEW, LB_ADDSTRING, 0, (LPARAM)uniMessage);
        }
        strLen = 0;
        //printf("Message from server: %s", message);
    }
    
    delete socketInfo;
    closesocket(socketInfo->hSocket);
    WSACleanup();

    return 0;
}

void StartServerConnect(WSADATA& wsaData, SOCKET& hSocket, SOCKADDR_IN& servAdr)
{
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        ErrorHandling("WSAStartup() error!");
    
    hSocket = socket(PF_INET, SOCK_STREAM, 0);
    if (hSocket == INVALID_SOCKET)
        ErrorHandling("socket() error");

    memset(&servAdr, 0, sizeof(servAdr));
    servAdr.sin_family = AF_INET;
    inet_pton(AF_INET, "127.0.0.1", &(servAdr.sin_addr));
    servAdr.sin_port = htons(atoi("7777"));

    SOCKDATA* sockData = new SOCKDATA();
    sockData->hSocket = hSocket;
    sockData->servAdr = servAdr;

    // 서버와 통신할 thread  생성
    _beginthreadex(NULL, 0, (_beginthreadex_proc_type)ServerThreadMain, (LPVOID)sockData, 0, NULL);
}


void ErrorHandling(const char *message)
{
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

#pragma endregion

Dialog ID : CHAT_DIALOG

채팅 ListView ID : CHAT_VIEW (Sort 하지말것)

채팅 메시지 입력 Edit ID : IDC_CHAT_ENTER 

확인 버튼 ID : IDOK


이전에 올린 IOCP 채팅 서버와 대응하는 클라이언트다

Post

IOCP 채팅 서버 소스 예제


윤성우의 TCP/IP 에코 채팅 서버에서

다른사람들에게 채팅 내용이 전송되도록 수정한 소스이다.


#include 
#include 
#include 
#include 
#include 
#include 
#include 


#pragma comment(lib, "ws2_32.lib")

#define BUF_SIZE 100
#define READ 3
#define WRITE 5

int const NAME_SIZE = 10;

typedef struct          // socket intfo

{
    SOCKET hClntSock;
    SOCKADDR_IN clntAdr;
}PER_HANDLE_DATA, *LPPER_HANDLE_DATA;

typedef struct // buffer info
{
    OVERLAPPED overlapped;
    WSABUF wsaBuf;
    char buffer[BUF_SIZE];
    int rwMode;             // READ or WRITE
    
}PER_IO_DATA, *LPPER_IO_DATA;

typedef struct
{
    char id[NAME_SIZE];
    unsigned int level;
    
}USER_INFO, *PUSER_INFO;        // 나중에 PER_HANDLE_DATA 상속하자

std::list UserList; // 다른사람에게 채팅 전달해야하므로 user list 추가

DWORD WINAPI EchoThreadMain(LPVOID CompletionPortIO);

CRITICAL_SECTION cs;        // UserList 동기화를 위한 Critical Section


int main()
{
    WSADATA wsaData;
    HANDLE hComPort;
    SYSTEM_INFO sysInfo;
    LPPER_IO_DATA ioInfo;
    LPPER_HANDLE_DATA handleInfo;

    SOCKET hServSock;
    SOCKADDR_IN servAdr;
    int recvBytes, i, flags = 0;

    if (0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
    {
        printf("WSAStartup() error!");
        exit(1);
    }

    hComPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
    GetSystemInfo(&sysInfo);

    for (i = 0; i < (int)sysInfo.dwNumberOfProcessors; ++i)
    {
        // Thread 핸들 정리 추가할 것
        _beginthreadex(NULL, 0, (_beginthreadex_proc_type)EchoThreadMain, (LPVOID)hComPort, 0, NULL);
    }

    hServSock = WSASocketW(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
    memset(&servAdr, 0, sizeof(servAdr));
    servAdr.sin_family = AF_INET;
    inet_pton(AF_INET, "127.0.0.1", &(servAdr.sin_addr));
    servAdr.sin_port = htons(atoi("7777"));

    bind(hServSock, (SOCKADDR*)&servAdr, sizeof(servAdr));
    listen(hServSock, 5);

    InitializeCriticalSection(&cs);

    while (1)
    {
        SOCKET hClntSock;
        SOCKADDR_IN clntAdr;
        int addrLen = sizeof(clntAdr);

        hClntSock = accept(hServSock, (SOCKADDR*)&clntAdr, &addrLen);
        
        handleInfo = (LPPER_HANDLE_DATA)malloc(sizeof(PER_HANDLE_DATA));        // 누군가 접속할 때 마다 소켓 정보를 생성하고
        handleInfo->hClntSock = hClntSock;                                      // hClntSock은 지역변수이므로 저장한다
        memcpy(&(handleInfo->clntAdr), &clntAdr, addrLen);

        EnterCriticalSection(&cs);
        UserList.push_back(handleInfo);
        LeaveCriticalSection(&cs);

        CreateIoCompletionPort((HANDLE)hClntSock, hComPort, (DWORD)handleInfo, 0);  // 접속한 클라 소켓을 IOCP에 등록함

        ioInfo = (LPPER_IO_DATA)malloc(sizeof(PER_IO_DATA));                        // 신규 유저 접속 시 overlapped도 생성한다.
        memset(&(ioInfo->overlapped), 0, sizeof(OVERLAPPED));                       // 그리고 WSARecv 함수로 소켓 io완료 시 반환되는 wasBuf, overlapped 주소를 등록한다
        ioInfo->wsaBuf.len = BUF_SIZE;
        ioInfo->wsaBuf.buf = ioInfo->buffer;
        ioInfo->rwMode = READ;

        WSARecv(handleInfo->hClntSock, &(ioInfo->wsaBuf), 1, (LPDWORD)&recvBytes, (LPDWORD)&flags, &(ioInfo->overlapped), NULL);    // recv가 완료되었을 때 GetQueue...에서 반환됨
    }   

    DeleteCriticalSection(&cs);

    return 0;
}

DWORD WINAPI EchoThreadMain(LPVOID pComPort)
{
    HANDLE hComPort = (HANDLE)pComPort;
    SOCKET sock;
    DWORD bytesTrans;
    LPPER_HANDLE_DATA   handleInfo;
    LPPER_IO_DATA       ioInfo;
    DWORD flags = 0;
    char msg[BUF_SIZE];

    while (1)
    {
        GetQueuedCompletionStatus(hComPort, &bytesTrans, (LPDWORD)&handleInfo, (LPOVERLAPPED*)&ioInfo, INFINITE);
        sock = handleInfo->hClntSock;

        if (READ == ioInfo->rwMode)
        {
            puts("message received!");

            if (0 == bytesTrans)
            {
                EnterCriticalSection(&cs);
                std::list::iterator iter;
                for (iter = UserList.begin(); iter != UserList.end(); ++iter)
                {
                    if (sock == (*iter)->hClntSock)
                    {
                        UserList.erase(iter);
                        break;
                    }
                }
                LeaveCriticalSection(&cs);

                closesocket(sock);
                free(handleInfo);
                free(ioInfo);
                continue;
            }

            memset(msg, 0, BUF_SIZE);
            memcpy(msg, ioInfo->buffer, BUF_SIZE);
            free(ioInfo);
            
            EnterCriticalSection(&cs);                      // UserList는 여러 스레드가 접근하는 공유자원이므로 접근 시 cs 필수 
            std::list::iterator iter;
            for (iter = UserList.begin(); iter != UserList.end(); ++iter)  
            {
                // 소켓마다 overlapped를 새로 만들어야 한다. 왜냐하면 하나의 overlapped를 여러 소켓이 쓸 수 없기 때문이다. 
                ioInfo = (LPPER_IO_DATA)malloc(sizeof(PER_IO_DATA));
                memset(&(ioInfo->overlapped), 0, sizeof(OVERLAPPED));
                ioInfo->wsaBuf.buf = msg;                   // msg는 스레드마다 가지고 있는 지역변수이므로 공유자원이 아니므로 cs 사용을 하지 않는다
                ioInfo->wsaBuf.len = bytesTrans;
                ioInfo->rwMode = WRITE;
                WSASend((*iter)->hClntSock, &(ioInfo->wsaBuf), 1, NULL, 0, &(ioInfo->overlapped), NULL);
            }
            LeaveCriticalSection(&cs);

            ioInfo = (LPPER_IO_DATA)malloc(sizeof(PER_IO_DATA));
            memset(&(ioInfo->overlapped), 0, sizeof(OVERLAPPED));
            ioInfo->wsaBuf.len = BUF_SIZE;
            ioInfo->wsaBuf.buf = ioInfo->buffer;
            ioInfo->rwMode = READ;
            WSARecv(sock, &(ioInfo->wsaBuf), 1, NULL, &flags, &(ioInfo->overlapped), NULL);
        }
        else
        {
            puts("message sent!");
            free(ioInfo);
        }
    }
    
    return 0;
}





실행하면 아래처럼 여러사람들에게 메시지가 전송된다.

내가 개인적으로 저장할 용도로 올리는거라서 수정, 추가할 부분이 많다:Q...

( 메시지큐를 이용해서 데이터 받는 부분, 처리부분 분리하기, 패킷 덜 왔을 때 합치기, acceptEx , 메모리풀 등..)



Post

window에서 cmd 실행시켜서 svnlook 명령어를 쳤더니

svnlook 은 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치파일.. 에러가 뜬다면..,,,,

이런 에러가 뜬다.

확인한 것은 두가지다.

 

1. 환경변수 확인

 

제어판 - 시스템 - 고급 - 환경변수 - 시스템 변수

PATH 에 svn 프로그램 위치를 추가한다.

 

C:\Program Files\TortoiseSVN\bin;

 

tortoies svn 설치하면 보통 설정되어있었고 나도 설정되어 있었다.

 

2.  Subversion 설치

 

나는 Subversion 이 설치가 되어있지 않았다. 

아래 링크에서 윈도우버전 설치하고 cmd 재실행 후 svnloock을 치면

 

사용법은 'svnlook help'를 통해 볼 수 있습니다.

 

라고 뜬다.

 

http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=11151&expandFolder=11151&folderID=91

Post


사용법

#pragma region RegionName


source code ...


#pragma endregion


설명

#pragma region 선언부터 endregion 까지 하나의 소스로 인식한다.

하나의 소스로 인식되면 코드 옆에 - , + 아이콘으로 코드를 한번에 접을 수 있어서 유용하다.


Post


새프로젝트 생성 시 Visual C++ - Window 데스크톱 - Windows 데스크톱 마법사를 선택해야

빈 프로젝트를 생성할 수 있다.(콘솔, 응용 선택창은 그 다음에 나온다)



Post

예전 서버 소스코드를 실행시키려고 하니 C4996에러가 났다.


C4996

'WSASocketA': Use WSASocketW() instead  or define      _WINSOCK_DEPRECATED_NO_WARNINGS      to disable deprecated API warnings


C4996 'inet_addr': Use inet_pton() or InetPton()      instead or define      _WINSOCK_DEPRECATED_NO_WARNINGS      to disable deprecated API warnings

OverlappedSend_Win_Wori


처음 C4996은 WSASocket 대신 WSASocketW 함수를 사용하라고 해서, 사용하니 해결.

두번째 c4996 Wanring은 inet_pton() or InetPton()  함수를 사용하라고 해서 수정하니 해결


#include <WS2tcpip.h>  // inet_pton 함수 사용시 include 해야함

inet_pton(AF_INET, "127.0.0.1", &(sendAdr.sin_addr));



Post

1>main.obj : error LNK2019: __imp__closesocket@4 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__connect@12 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__htons@4 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__inet_addr@4 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSAStartup@8 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSACleanup@0 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSAGetLastError@0 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSACloseEvent@4 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSACreateEvent@0 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSAGetOverlappedResult@20 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSASend@28 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSASocketA@24 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.

1>main.obj : error LNK2019: __imp__WSAWaitForMultipleEvents@20 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다.



#pragma comment(lib, "ws2_32.lib")

lib 포함시켜주면 된다.

'이전게시판 > Server' 카테고리의 다른 글

IOCP window 채팅 클라이언트 소스  (0) 2018.10.04
IOCP 채팅 서버 소스 예제  (0) 2018.10.04
C4996 에러  (0) 2018.09.28
구글 프로토콜 버퍼 C++ Window 예제 (Google Protocol buffer)  (0) 2018.07.27
기본 서버 예제의 문제점  (0) 2018.07.05
C4996 inet_addr Error Solution  (0) 2018.06.30
ip주소 추적  (0) 2018.04.21
hosts파일, DNS  (0) 2018.04.21
▲ top