네트워크 프로그래밍/연습문제

[네트워크 프로그래밍] 2장 연습문제

ttttki913 2024. 9. 20. 21:22
TCP/IP 소켓 프로그래밍 2판(한빛아카데미, 2022) 연습문제 풀이

 

01 첫 번째 InitSocket 예제를 수정하여 wsa 변수의 필드 중 처음 네 개(wVersion, wHighVersion, szDescription, szSystemStatus)를 화면에 출력하시오. 윈속 1.1 버전을 사용하도록 예제를 수정하면 이 값들이 어떻게 바뀌는가?

#include "..\..\Common.h"

int main(int argc, char* argv[])
{
	// 윈속 초기화
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(1, 1), &wsa) != 0)
		return 1;
	printf("[알림] 윈속 초기화 성공\n");

	printf("wVersion: %d\n", wsa.wVersion);
	printf("wHighVersion: %d\n", wsa.wHighVersion);
	printf("szDescription: %s\n", wsa.szDescription);
	printf("szSystemStatus: %s\n", wsa.szSystemStatus);

	// 윈속 종료
	WSACleanup();
	return 0;
}

 

02-A [윈도우] 두 번째 InitSocket 예제를 수정하여 UDP 소켓을 생성하시오.

02-B [리눅스] InitSocket 예제를 수정하여 UDP 소켓을 생성하시오.

<-- 윈도우 -->
#include "..\..\Common.h"

int main(int argc, char* argv[])
{
	// 윈속 초기화
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
		return 1;
	printf("[알림] 윈속 초기화 성공\n");

	// 소켓 생성 - UDP SOCK_STREAM -> SOCK_DGRAM
	SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);
	if (sock == INVALID_SOCKET) err_quit("socket()");
	printf("[알림] 소켓 생성 성공\n");

	// 소켓 닫기
	closesocket(sock);

	// 윈속 종료
	WSACleanup();
	return 0;
}

 

03-A [윈도우] 두 번째 InitSocket 예제를 수정하여 IPv6 프로토콜에 기반한TCP 소켓을 생성하시오.

03-B [리눅스]  InitSocket 예제를 수정하여 IPv6 프로토콜에 기반한 TCP 소켓을 생성하시오.

#include "..\..\Common.h"

int main(int argc, char* argv[])
{
	// 윈속 초기화
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
		return 1;
	printf("[알림] 윈속 초기화 성공\n");

	// 소켓 생성 - IPv6 : AF_INET6 붙여줌
	SOCKET sock = socket(AF_INET6, SOCK_STREAM, 0);
	if (sock == INVALID_SOCKET) err_quit("socket()");
	printf("[알림] 소켓 생성 성공\n");

	// 소켓 닫기
	closesocket(sock);

	// 윈속 종료
	WSACleanup();
	return 0;
}

04-A [윈도우] 두 번째 InitSocket 예제를 수정하여 IPv6 프로토콜에 기반한 UDP 소켓을 생성하시오.

04-B [리눅스] InitSocket 예제를 수정하여 IPv6 프로토콜에 기반한 UDP 소켓을 생성하시오.

#include "..\..\Common.h"

int main(int argc, char* argv[])
{
	// 윈속 초기화
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
		return 1;
	printf("[알림] 윈속 초기화 성공\n");

	// 소켓 생성 - IPv6기반 UDP 소켓 : AF_INET6 + SOCK_DGRAM
	SOCKET sock = socket(AF_INET6, SOCK_DGRAM, 0);
	if (sock == INVALID_SOCKET) err_quit("socket()");
	printf("[알림] 소켓 생성 성공\n");

	// 소켓 닫기
	closesocket(sock);

	// 윈속 종료
	WSACleanup();
	return 0;
}

05-A [윈도우] 사용자 정의 함수도 일반 소켓 함수와 같은 방법으로 소켓 오류를 처리할 수 있다. 다 음을 참고하여 f() 함수를 정의하시오. 단, WSASetLastError() 함수를 활용한다. 함수 정의 int f(int x) { } ... 함수 사용 • x가 0 또는 양수이면 성공 리턴값은 0이고, 오류 코드는 0으로 설정한다. •><가 음수이면 실패 리턴값은 S0CKET_ERR0R이고, 오류 코드는 WSAEINVAL로 설정한다. int retval = f(-100); // 테스트를 위해 함수가 실패하도록 값을 넣어준다. if (retval == S0CKET_ERR0R) err_quit("f()");

 

05-B [리눅스] 사용자 정의 함수도 일반 소켓 함수와 같은 방법으로 소켓 오류를 처리할 수 있다. 다 음을 참고하여 f() 함수를 정의하시오. 단, 전역 변수 errno를 변경한다. 함수 정의 int f(int x) { } ... 함수 사용 • x가 0 또는 양수이면 성공 리턴값은 0이고, 오류 코드는 0으로 설정한다. •)<가 음수이면 실패 리턴값은 -1 이고, 오류 코드는 EINVAL로 설정한다. int retval = <100); // 테스트를 위해 함수가 실패하도록 값을 넣어준다. if (retval < 0) err_quit("f()");

int f(int x) {
	if (x >= 0) {
		WSASetLastError(0);
		return 0;
	}
	else {
		WSASetLastError(WSAEINVAL);
		return SOCKET_ERROR;
	}
}

 

06 [윈도우] socket() 함수와 기본 역할은 같지만 향상된 기능을 제공하는 WSASocket() 함수가 있 다. WSASocket() 함수를 사용하여 TCP 소켓과 UDP 소켓을 생성하시오.

#include "..\..\Common.h"

int main(int argc, char* argv[])
{
	// 윈속 초기화
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
		return 1;
	printf("[알림] 윈속 초기화 성공\n");

	// 소켓 생성 WSASocket() 함수 사용 TCP 소켓 생성
	SOCKET sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
	if (sock == INVALID_SOCKET) err_quit("socket()");
	printf("[알림] 소켓 생성 성공\n");

	// 소켓 닫기
	closesocket(sock);

	// 윈속 종료
	WSACleanup();
	return 0;
	
	
}
#include "..\..\Common.h"

int main(int argc, char* argv[])
{
	// 윈속 초기화
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
		return 1;
	printf("[알림] 윈속 초기화 성공\n");

	// 소켓 생성 WSASocket() 함수 사용 UDP 소켓 생성
	SOCKET sock = WSASocket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_OVERLAPPED);
	if (sock == INVALID_SOCKET) err_quit("socket()");
	printf("[알림] 소켓 생성 성공\n");

	// 소켓 닫기
	closesocket(sock);

	// 윈속 종료
	WSACleanup();
	return 0;
	
	
}

* TCP - SOCK_STREAM, IPPROTO_TCP

* UDP - SOCK_DGRAM, IPPROTO_UDP

* IPv4 - AF_INET

* IPv6 - AF_INET6