TCP 6

WSAEventSelect 모델

WSAEventSelect 모델 MSDN 소켓과 관련된 네트워크 이벤트를 이벤트 객체를 통해 감지한다. 아래 그림과 같이 이벤트 객체를 소켓당 하나씩 생성하고 이벤트 객체들을 관찰하면 멀티스레드를 사용하지 않고도 소켓을 처리할 수 있다. WSAEventSelect 모델의 동작 원리 WSAEventSelect 모델을 사용하면 소켓 함수 호출이 성공할 수 있는 시점을 이벤트 객체를 통해 알 수 있다. 위 그림과 같이 소켓에 대해 이벤트 객체를 생성하여 짝지어두면, 네트워크 이벤트가 발생할 때마다 이벤트 객체가 신호 상태가 된다. 따라서 이벤트 객체의 상태 변화를 관찰함으로써 네트워크 이벤트 발생을 감지할 수 있다. [표 1] WSAEventSelect 모델의 필요 기능과 관련 함수 필요 기능 관련 함수 이벤..

공부 2020.10.20

Select모델 에코서버 프로그래밍

Select모델 에코서버 프로그래밍 Select 모델 소켓모드(블로킹, 넌블로킹)와 관계없이 여러 소켓을 한 스레드로 처리할 수 있다 서버 코드 더보기 #pragma comment(lib, "ws2_32") #include #include #include #define SERVERPORT 9000 #define BUFSIZE 512 // 소켓 정보 저장을 위한 구조체와 변수 struct SOCKETINFO { SOCKET sock; char buf[BUFSIZE + 1];// 맨 끝에 '\0' int recvBytes; int sendBytes; }; int nTotalSockets = 0; SOCKETINFO* socketInfoArray[FD_SETSIZE]; // 소켓 관리 함수 BOOL AddSo..

공부 2020.10.17

TCP 파일전송 프로그램

TCP 파일전송 프로그램 서버정보 localhost(127.0.0.1):7000 송신할 파일정보 이름 Blackpink.jpg 파일크기 415,128 바이트 실행결과 서버 클라이언트 서버 코드 #include #include #include #pragma comment(lib, "Ws2_32.lib") #pragma pack(push, 1) typedef struct st_PACKET_HEADER { DWORD dwPacketCode;// 0x11223344 우리의 패킷확인 고정값 WCHAR szName[32];// 본인이름, 유니코드 NULL 문자 끝 WCHAR szFileName[128];// 파일이름, 유니코드 NULL 문자 끝 int iFileSize; } PACKET_HEADER; #pragma..

공부 2020.10.13

내 PC의 backlog 큐 개수 구하기

내 PC의 backlog 큐 개수 구하기 20210731 수정 아이디 '백수'님의 조언을 참고해서 클라이언트 코드를 수정해서 다시 테스트 해 보았다 생각해보니 현재 테스트는 클라이언트의 연결이 유지될 필요가 없었다 connect() 후 closesocket()을 호출하도록 코드를 수정했다 TIME_WAIT 상태가 남지 않도록 링거옵션도 추가했다 클라이언트 코드 #pragma comment(lib, "Ws2_32.lib") #include #include #include int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { wprintf_s(L"WSAStartup() errcode[%d]\n", WSAGetLastErr..

공부 2020.10.08

20200903 공부

1. 문제 만들기 2. 멀티스레드 1) 스레드 생성과 종료, 인자 전달 연습 2) 스레드 우선순위 변경 연습 3) 스레드 실행 제어와 종료 기다리기 연습 4) 멀티스레드 TCP 서버 1. 문제 만들기 1) x86 함수 호출 규약 (1), (2), (3) 에 해당하는 값을 채우시오. 규약 인자 전달 순서 인자 전달 매체 Stack을 정리하는 함수 cdecl ← Stack ( 2 ) stdcall ( 1 ) Stack ( 3 ) fastcall ← Register + Stack Callee 2) 함수 포인터 ( ? ) 부분을 채워서 코드를 완성하시오 int Sum(int a, int b) { return a + b; } int main() { ( ? ) int res = FuncSum(10, 20); ret..

공부 2020.09.03

20200902 공부

1. 데이터 전송하기 2 1) 가변 길이 데이터 전송 연습 2) 고정 길이 + 가변 길이 데이터 전송 연습 3) 데이터 전송 후 종료 연습 1. 데이터 전송하기 2 1) 가변 길이 데이터 전송 연습 클라이언트 코드 수정 // 가변 길이 데이터 전송 // EOR = '\n' const int bufSize = 50; char buf[bufSize]; const char* testData[] = { "안녕하세요", "반가워요", "오늘따라 할 이야기가 많을 것 같네요", "저도 그렇네요" }; for (int i = 0; i < 4; i++) { int len = strlen(testData[i]); strcpy_s(buf, bufSize, testData[i]); buf[len++] = '\n'; ret ..

공부 2020.09.02