디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

네트워크 에뮬레이터 주소 어떻게 설정해야함??

프갤러(58.76) 2024.05.09 11:58:32
조회 67 추천 0 댓글 0
														


a17d2cad2f1b782a99595a48fa9f3433f728bd6f6b8abd3f6659acf9d1


#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <WinSock2.h>

#include <ws2tcpip.h>

#include <process.h>

#include <conio.h>


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


int TCP = 0; // 전역변수, TCP가 0이면 UDP 방식, 1이면 TCP 방식


// 에러 감지용

void error_handling(const char* message) {

    fputs(message, stderr);

    fputc('\n', stderr);

    exit(1);

}


// 서버 thread

unsigned __stdcall server_thread(void* arg) {

    int serv_sock; // 변수: 서버 소켓


    // UDP 연결일경우

    if (TCP == 0) {

        serv_sock = socket(AF_INET, SOCK_DGRAM, 0);

        if (serv_sock == -1)

            error_handling("에러: 소켓에 문제가 발생했습니다.");


    }

    else // TCP 연결일경우

    {

        serv_sock = socket(AF_INET, SOCK_STREAM, 0);

        if (serv_sock == -1)

            error_handling("에러: 소켓에 문제가 발생했습니다.");


    }


    // 소켓 포트와 IP 지정

    struct sockaddr_in serv_addr;

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;

    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    serv_addr.sin_port = htons(8080);


    // bind 지정

    if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)

        error_handling("에러: 접근에 문제가 발생했습니다.");


    // TCP일 경우 listen 및 accept 사용

    if (TCP == 1) {

        if (listen(serv_sock, 5) == -1)

            error_handling("에러: 듣기에 문제가 발생했습니다.");


        struct sockaddr_in clnt_addr;

        socklen_t clnt_addr_size = sizeof(clnt_addr);

        int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

        if (clnt_sock == -1)

            error_handling("에러: 승인에 문제가 발생했습니다.");


        // TCP 방식으로 메시지 수신 및 응답

        while (1) {

            char buffer[1024];

            int bytes_received = recv(clnt_sock, buffer, sizeof(buffer) - 1, 0);

            if (buffer[0] == 'E' && buffer[1] == 'N' && buffer[2] == 'D' && buffer[3] == '\n') break;// 'END' 메시지 확인

            if (bytes_received <= 0) {

                error_handling("에러: 전송에 문제가 발생했습니다.");

            }


            buffer[bytes_received] = '\0';


            // TCP식 응답 전송

            if (send(clnt_sock, buffer, strlen(buffer), 0) == -1) {

                error_handling("에러: 전송에 문제가 발생했습니다.");

            }

        }


        closesocket(clnt_sock);

        closesocket(serv_sock);//소켓 종료

    }

    else // UDP일 경우, listen과 accept를 사용하지 않음

    {

        struct sockaddr_in clnt_addr;

        socklen_t clnt_addr_size = sizeof(clnt_addr);


        // UDP 방식으로 메시지 수신 및 응답

        while (1) {

            char buffer[1024];

            int bytes_received = recvfrom(serv_sock, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&clnt_addr, &clnt_addr_size);

            if (buffer[0] == 'E' && buffer[1] == 'N' && buffer[2] == 'D' && buffer[3] == '\n') break;// 'END' 메시지 확인

            if (bytes_received <= 0) {

                error_handling("에러: 전송에 문제가 발생했습니다.");

            }


            buffer[bytes_received] = '\0';


            // UDP식 응답 전송

            if (sendto(serv_sock, buffer, strlen(buffer), 0,

                (struct sockaddr*)&clnt_addr, sizeof(clnt_addr)) == -1) {

                error_handling("에러: 전송에 문제가 발생했습니다.");

            }

        }


        closesocket(serv_sock); //소켓 종료

    }

    return 0;

}


// 클라이언트 thread

unsigned __stdcall client_thread(void* arg) {

    int clnt_sock; // 클라이언트 소켓


    // UDP 연결일경우

    if (TCP == 0) {

        clnt_sock = socket(AF_INET, SOCK_DGRAM, 0);

        if (clnt_sock == -1)

            error_handling("에러: 소켓에 문제가 발생했습니다.");

        printf("UDP 환경으로 연결되었습니다.\n");

    }

    else // TCP 연결일경우

    {

        clnt_sock = socket(AF_INET, SOCK_STREAM, 0);

        if (clnt_sock == -1)

            error_handling("에러: 소켓에 문제가 발생했습니다.");

        printf("TCP 환경으로 연결되었습니다.\n");

    }


    // 소켓 포트와 IP 지정

    struct sockaddr_in serv_addr;

    memset(&serv_addr, 0, sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;

    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // local host 사용

    serv_addr.sin_port = htons(8080);


    if (connect(clnt_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {

        error_handling("에러: 연결에 문제가 발생했습니다.");

    }


    // 메시지 입력받은 다음 그 내용을 서버에 전송함(반복)

    while (1) {

        int escape = 0; // 탈출용 변수

        printf("server로 보낼 메시지 입력: ");

        char input[1024];

        fgets(input, sizeof(input), stdin);


        if (input[0] == 'E'&& input[1] == 'N'&& input[2] == 'D'&& input[3] == '\n') { // 'END' 메시지 확인

            printf("'END' 응답을 받았습니다.연결 종료 중...\n");

            escape = 1;

        }


        // 클라이언트에서 서버로 메시지 전달

        if (send(clnt_sock, input, strlen(input), 0) == -1 && escape == 0) {

            error_handling("에러: 클라이언트 쪽 전송에 문제가 발생했습니다.");

        }


        if (escape == 1) break;


        // 서버로부터 응답 수신

        char responseFromServer[1024];

        int bytes_received = recv(clnt_sock, responseFromServer, sizeof(responseFromServer) - 1, 0);

        if (bytes_received > 0 && escape == 0) {

            responseFromServer[bytes_received] = '\0';

            printf("서버로부터 응답: %s\n\n", responseFromServer);

        }

        else if (bytes_received == -1 && escape == 0) {

            error_handling("에러: 수신에 문제가 발생했습니다.");

        }

    }

    closesocket(clnt_sock); // 소켓 종료

    return 0;

}


int main() {

    // Windows 소켓 구현에 대한 정보

    WSADATA wsaData;

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {

        error_handling("에러: 빌드에 문제가 발생했습니다.");

    }


    int key = 0;

    printf("연결 방식을 선택하십시오. (U : UDP / T : TCP)");


    // 맨 처음에는 키보드 입력 방식으로 UDP / TCP 연결을 결정함

    while (1) {

        if (_kbhit())

        {

            key = _getch();

            // 아스키 코드 117은 U

            if (key == 117) {

                TCP = 0;

                system("cls");

                break;

            }

            // 아스키 코드 116은 T

            else if (key == 116) {

                TCP = 1;

                system("cls");

                break;

            }

        }

    }


    // 서버 및 클라이언트 thread 실행

    HANDLE hServerThread = (HANDLE)_beginthreadex(NULL, 0, server_thread, NULL, 0, NULL);

    if (hServerThread == NULL) {

        error_handling("에러: 서버 스레드 생성에 문제가 발생했습니다.");

    }


    HANDLE hClientThread = (HANDLE)_beginthreadex(NULL, 0, client_thread, NULL, 0, NULL);

    if (hClientThread == NULL) {

        error_handling("에러: 클라이언트 스레드 생성에 문제가 발생했습니다.");

    }


    // thread 종료때까지 대기

    WaitForSingleObject(hServerThread, INFINITE);

    WaitForSingleObject(hClientThread, INFINITE);


    CloseHandle(hServerThread);

    CloseHandle(hClientThread);


    // Windows 소켓 종료

    WSACleanup();


    // 완전 종결

    return 0;

}


코드는 이렇게 TCP 연결 위해서 만들었는데


local ip에 로컬호스트(127.0.0.1) 해놨는데도 인식 자체를 못함



추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 끝까지 다 본 걸 후회하게 만든 용두사미 드라마는? 운영자 25/07/07 - -
2869691 눈쟁이 잇섭 조코딩 이런애들은 왜 ceo만나는걸 자랑하고다니는거임?? [2] 타이밍뒷통수한방(1.213) 07.04 99 0
2869690 중국 블로그 글이랑 내 작업해야하는데 이번 의뢰 너무 오래걸리노 ㅆㅇㅆ(124.216) 07.04 53 0
2869689 방금 할거없어서 윈도우10 업그레이드할뻔한거 참았다 타이밍뒷통수한방(1.213) 07.04 40 0
2869688 이게 무슨 뜻이야..? 뉴비 프로그래머 살려줘 [5] supersns갤로그로 이동합니다. 07.04 94 0
2869686 뀨? ♥냥덩이♥갤로그로 이동합니다. 07.04 40 0
2869685 나님 천국이에양..⭐+ ♥냥덩이♥갤로그로 이동합니다. 07.04 49 0
2869683 프로그래머스 vs 리트코드 [1] 프갤러(110.13) 07.04 56 0
2869682 깼다. 콜드브루 언제 사지..., 텀블러할인되나... 넥도리아(175.196) 07.04 40 0
2869680 ❤✨☀⭐나님 시작합니당⭐☀✨❤ [2] ♥냥덩이♥갤로그로 이동합니다. 07.04 64 0
2869679 토르로 내파일에 있는 이미지 업로드해도 ㄱㅊ? [1] 프갤러(59.14) 07.04 52 0
2869678 너무 억울하다 클라가 api설치를 못한 초보라서 [4] ㅆㅇㅆ찡갤로그로 이동합니다. 07.04 99 0
2869677 클라실행 안되서 시간더달라고 빌어놓고 ㅇㅇ(211.235) 07.04 59 2
2869676 머리가 너무 복잡하다. 그냥 다 놓고 싶다. [2] ㅇㅇ(223.38) 07.04 99 0
2869675 solid 원칙 소프트웨어 공학 배울땐 그정도로 중요한가 했었는데 [2] ㅇㅇ(118.235) 07.04 87 2
2869673 임베디드 입문했는데 ㅇㅇ(118.235) 07.04 67 0
2869671 러스트 까는 이유 [1] 프갤러(61.75) 07.04 68 0
2869669 이거 괜찮은편임? [4] 뜌땨땨땨갤로그로 이동합니다. 07.04 88 0
2869668 웹개발 입문자인데 flask 괜찮나요? [1] 프갤러(14.52) 07.04 84 0
2869667 형님들 어플 관련 오류 도와주십쇼 ㅠㅠ [2] 단팥빵갤로그로 이동합니다. 07.04 56 0
2869665 해선 틱사이즈이거 변동값이냐? ㅆㅇㅆ(124.216) 07.04 45 0
2869664 야 근데 디시 크롤링 하려고 켰는데 디시에 캡챠 추가됐노 ㅆㅇㅆ(124.216) 07.04 71 0
2869662 구글 ads 미팅중인데 [2] 뉴진파갤로그로 이동합니다. 07.04 72 0
2869661 아스카의 유일한 단점은 [4] 아스카영원히사랑해갤로그로 이동합니다. 07.04 81 0
2869660 정신병자 팀원 어떡하냐? ㅇㅇ갤로그로 이동합니다. 07.04 69 1
2869658 본인 내일 C 입문함 각오하셈 [1] 프갤러(123.142) 07.04 76 0
2869655 아 유니티 해야하는데 씨발 [2] 류도그담당(58.239) 07.04 72 0
2869654 납품 시간 늘려줬다고 기능 하나 더 넣어달라고 존나 떼쓰네 ㅆㅇㅆ(124.216) 07.04 58 0
2869652 소설 <롤리타> <내가 사랑하는 초등학생> 차이는? [1] 발명도둑잡기(118.216) 07.04 73 0
2869650 5시간 잤더니 졸리다 발명도둑잡기(118.216) 07.04 43 0
2869649 대기업 다니다가 50세 은퇴하고 자영업하고 느낀점 10가지 [1] 발명도둑잡기(118.216) 07.04 85 0
2869648 스카이데일리 데스크 사망 이유는? 발명도둑잡기(118.216) 07.04 63 0
2869647 ,,ԾㅂԾ,,;; ♥냥덩이♥갤로그로 이동합니다. 07.04 47 0
2869646 이효리(李孝利) 발명도둑잡기(118.216) 07.04 49 0
2869645 트럼프-머스크 갈등 재점화…머스크 "신당 창당" 공세 발명도둑잡기(118.216) 07.04 75 0
2869642 SAP좀 탐나네 [3] 개멍청한유라갤로그로 이동합니다. 07.04 94 0
2869640 부모님께 효를 다하자 [5] 개멍청한유라갤로그로 이동합니다. 07.04 67 0
2869639 백엔드인가 저기 갤러리 좀 공격적이네 [2] 프갤러(118.235) 07.04 97 0
2869636 금서 [3] 발명도둑잡기(39.7) 07.04 62 0
2869632 [SAP Korea] 2025 SAP CODE 아카데미 1기 모집 (~8 프갤러(14.32) 07.04 506 0
2869631 오랜만에 고기를 사들고 [6] 개멍청한유라갤로그로 이동합니다. 07.04 70 0
2869630 평범한 국내 중소이면서 왜 코딩테스트를 자꾸 영문으로 보내 [8] 프갤러(110.13) 07.04 102 0
2869629 [메가존클라우드] DevOps 아키텍트 SecOps 채용연계형 국비지원 [1] 교육운영팀갤로그로 이동합니다. 07.04 92 0
2869627 It트렌드는 어디어디보심? [2] ㅇㅇ갤로그로 이동합니다. 07.04 67 0
2869626 내 알리익스프레스 계정 정지 이유가 보안상의 이유라는데 발명도둑잡기(118.216) 07.04 69 0
2869625 이런... 운이 나쁘시군. 마침 이 몸이 화장실에 왔을 때 러까하다니 [3] 프갤러(218.154) 07.04 76 0
2869624 ms도 버린 러스트 왜 빠는지 모르겠네 [2] 프갤러(211.234) 07.04 85 0
2869623 섹스가 지겹다 [3] 아스카영원히사랑해갤로그로 이동합니다. 07.04 105 0
2869621 러까 저능아들 운 좋은 줄 알아라 [1] 프갤러(218.154) 07.04 79 1
2869620 그냥 작은판에서 성공(경제적 성공은 아님) 을 맞은 사람이 [2] 프갤러(175.208) 07.04 107 4
2869619 금요일에 일 추가로 시키진 않겠지 [1] 아스카영원히사랑해갤로그로 이동합니다. 07.04 64 0
뉴스 세계 2위 재벌 황태자, 블랙핑크 멤버에 푹 빠져 한국 왔다 디시트렌드 07.10
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2