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
'네트워크 프로그래밍 > 연습문제' 카테고리의 다른 글
| [네트워크 프로그래밍] 4장 연습문제 (4, 6, 8번) (0) | 2024.11.11 |
|---|---|
| [네트워크 프로그래밍] 3장 연습문제 (0) | 2024.09.26 |
| [네트워크 프로그래밍] 1장 연습문제 (0) | 2024.09.20 |