Post Lists

2018년 6월 30일 토요일

Networking - Intro

http://beej.us/guide/bgnet/html/single/bgnet.html

1. Intro
안녕! 소켓 프로그래밍이 널 힘들게 했어? 이것이 man page에서 알아내는게 너무 어려운 것이냐? 너는 멋진 인터넷 프로그래밍을 하고 싶어하지만, connect()하기전에 bind()를 호출해야만하는 것을 알아야하는지에 대해  많은 양의 구조체를 헤집어 나갈 시간이 없다.

내가 이 끔찍한 일들을 다 해놓았다. 그래서 나는 모든 사람과 이 정보를 나누고 싶다. 너는 올바른 장소에 왔다. 이 문서는 평균적인 유능한 C 프로그래머에게 그 또는 그녀가 이 네트워킹 소음에 이해해야할 것들을 준다.

그리고 확인해보아라. 나는 마침내 미래를 따라 잡았고 IPv6에 대한 가이드를 업데이트 했다. 즐겨라

1.1 Audience
이 문서는 완전한 레퍼런스가 아닌 튜토리얼로 작성된다. 그것은 소켓프로그래밍을 시작하려고 하고 발판을 찾으려는 개인이 있을 때 가장 좋다. 확실히 소켓 프로그래밍에 대한 완전하고 종합적인 가이드는 아니다.

희망스럽게도, 그러한 맨 페이지들이 이해되기 시작하는 걸로 충분할 것이다.

1.2 Platform and Compiler
이 문서에 포함된 코드는 Gnu의 gcc compiler를 사용하여 Linux PC에서 컴파일 되었다. 그러나 그것은 gcc를 사용하는 어떤 플랫폼에서든지 빌드되어야 한다. 자연스럽게, 만약 너가 윈도우를 위해서 프로그래밍 하고 있따면 적용되지 않는다. - 아래에서 Windows programming 섹션을 보아라.

1.3 Official Homepage and Books For sale
이 문서의 공식 위치는 http://beej.us/guide/bgnet/ 이다. 거기에서 너는 또한 예제 코드와 가이드의 여러 언어로의 번역본을 볼 수 있을 것이다.

멋지게 된 프린트 카피를 사기위해서 (어떤 사람들은 책이라 부르는),  http://beej.us/guide/url/bgbuy를 방문해라. 구입에 대해 감사히 생각한다. 그것은 나의 문서를 쓰는 라이프스타일을 유지하는데 도움이 되기 때문이다.

1.4 Note for Solaris/SunOS Programmers
Solaris 또는 SunOS를 위해 컴파일할 때, 너는 적절한 라이브러리에서 linking을 위해 몇 가지 추가 command-line 스위치들을 명시할 필요가 있다. 이것을 하기 위해서, 간단히 "-lnsl -lsocket -resolv"를 컴파일 명령어의 끝에 추가해라, 이렇게:

  $ cc -o server server.c -lnsl -lsocket -resolv

만약 너가 여전히 에러를 얻는다면, command line의 끝에 "-lxnet"를 시험삼아 추가해보아라. 나는 그것이 정확히 무엇을 하는지 모르지만, 몇몇 사람들은 그것이 필요한 것처럼 보인다.

너가 여전히 문제를 발견할지도 모르는 다른 장소는 setsockopt()에 대한 호출에서 이다. 프로토타입은 나의 Linux box에서의 그것과 다르다, 그래서

  int yes = 1;

대신에 이것을 넣어라:

  char yes='1';

Sun box를 가지지 않고 있기 떄문에, 나는 위의 정보를 검증해보지 않았다. -이것은 사람들이 이메일로 나에게 말해준 것이다.

1.5 Note for Windows Programmers
가이드의 이 시점에서, 역사적으로 나는 간단히 내가 그것을 많이 좋아하지 않는다는 사실 때문에 윈도우즈를 잘 안했다. 그러나 나는 정말 공평해져야 하고 윈도우즈가 거대한 install base를 가지고 있고 명백히 완벽하게 좋은 운영체제라는 것을 말해야만 한다.

그들은 부재가 마음이 더 좋아도록 만들 것이라고 말한다. 그래서 이 경우에, 나는 그것이 사실이라고 믿는다. 그러나 내가 말할 수 있는 것은, 내 개인 작업을 위해 마이크로소프트의 운영체제를 사용하지 않은 십년의 시간 후에, 나는 더 행복해졌다. 그렇기에, 나는 뒤로 물러앉아서 안전하게 "그래요, 윈도우즈를 편하게 사용하세요"라고 말할 수 있다.  그래.. 그것은 내가 나의 이빨을 그렇게 말하도록 갈도록 만든다.

그래서 대신에 나는 여전히 너가 LInux, BSD 또는 다른 Unix 맛을 시도하라고 격려한다.

그러나 사람들은 그들이 좋아하는 것을 좋아한다. 그리고 윈도우즈 사람들은 몇 가지 변화와 함께 이 정보가 너희들에게 적용될 수 있다는 것을 알아서 행복할 것이다. 너가 할 수 있는 한 가지 멋진 것은 Cygwin을 설치하는 것이다. 그것은 윈도우즈를 위한 Unix tool들의 모음이다. 나는 그렇게 하는 것인 모든 이러한 프로그램들이 수정될 수 없는 것을 컴파일 하게 한다는 헛소리를 들었다.

그러나 너는 Puer Windows 방식으로 하기를 원할지도 모른다. 그것은 너에게 매우 거칠고, 이것은 너가 해야만 하는 것이다: 빠져나와서 즉시 Unix로 해라! 아니아니야 - 농담이다. 나는 요즘에 Windows-friendly 할려고 한다.

이것은 너개 해야할 것인다 (만약 너가 Cygwin을 설치 안한다면!): 처음에 여기에서 내가 언급한 모든 시스템 헤더 파일들을 무시해라. 너가 include 할 필요 있는 모든 것은:

  #include <winsock.h>

기다려라! 너는 또한 socket library로 어떤 것을 하기 전에 WSAStartup()을 호출해야만 한다. 그 코드는 이렇게 보인다.

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>

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

int main()
{
    WSADATA wsaData; // if this doesn't work
    // WSAData wsaData; then try this instead

    // MAKEWORD(1,1) for Winsock 1.1, MAKEWORD(2,0) for Winsock 2.0:

    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
        fprintf(stderr, "WSAStartup failed.\n");
    }
}

너는 또한 Winsock 라이브러리에서 너의 컴파일러에게 link하라고 말해야한다. 보통 Winsock2.0을 위한 wsock32.lib또는 winsock32.lib 또는 ws2_32.lib라고 불려지는. VC++에서, 이것은 프로젝트 메뉴를 통해 처리될 수 있다. 설정에서 Link 탭을 클릭하고 "Object/library modules"라고 이름있는 박스를 찾아라. "wsock32.lib"을 목록에 추가해라 (또는 너가 선호하는 lib 무엇이든)

마지막으로 너는 WSACleanup()을 호출 할 필요가 있다. 너가 소켓 라이브러리로 모든 일을 했을 때, 세부사항을 위해서 online help를 보아라.

일단 너가 그렇게 한다면 이 튜토리얼에서의 나머지 예제들은 일반적으로 몇 가지 예외와 함께 적용될 것이다. 한 가지 것에 대해, 너는 socket을 닫기위해 close()를 사용할 수 없고, closesocket()을 사용할 필요가 있다. 대신에, 또한 select()는 file descriptors가 아닌(stdin을 위한 0같은) 오직 socket descriptors와 작업한다.

너가 사용할 수 있는 또한 한 소켓 클래스 CSocket이 있다. 더 정보를 원한다면 컴파일러 헬프 페이지를 참조해라.

Winsock에 대한 정보를 더 얻기 위해, Winsock FAQ를 읽고 거기로 가라.

마지막으로 나는 Windows가 fork() 시스템 호출이 없다는 것을 들었다. 그 호출은 불행히도 나으 예제에서 사용되는 것이다. 아마도 너는 POSIX 라이브러리에서 링크해야하거나 또는 그것을 작동시키는 어떤 것을 LINK해야 한다. 또는 너는 대신에 CreateProcess()를 사용할 수 있다. fork()는 어떠한 인자를 받지 않는다. CreateProcess()는 엄청 많은 인자를 받는다. 만약 너가 거기에 매달릴게 아니라면, CreateThread()는 다루기에 더 쉽다. 불행히도 멀티쓰레딩에 대한 토론은 이 문서의 범위를 넘어선다. 너도 알겠지만 나는 오직 많은 것에 대해 말할 수 있다.

1.6 Email Policy
나는 일반적으로 이메일 질문으로 도움을 줄 수 있다. 그래서 자유롭게 써라. 그러나 나는 답변을 보장할 수 없다. 나는 꽤 바쁘게 살고 있고, 내가 너가 가진 질문을 답할 수 없는 시간들도 있따. 그럴 경우에, 나는 보통 그 메세지를 지운다. 개인적인 것이 아니다. 나는 너가 요구하는 세부적인 답을 줄 시간이 없을 것이다.

규칙으로서, 질문이 복잡하면 할수록, 나는 덜 답변할 지도 모른다. 만약 너가 메일 보내기전에 너의 질문을 쉽게할 수 있다면, 어떤 적절한 정보를 포함하도록 해라. (플랫폼, 컴파일러, 너가 얻은 에러메세지, 너가 생각하기에 내가 troubleshoot하는데 도와줄 어떤것), 그러면 너는 좀 더 대답을 얻을 가능성이 높다.

만약 너가 대답을 얻지 못하면, 좀 더 파고들어서 답을 찾으려고 노력해라, 만약 그것이 여전히 참기 힘들다면, 나에게 너가 찾은 정버를 가지고 다시 써라. 그러면 운좋게도 내가 도와주기에 충분할 것이다.

내가 너에게 어떻게 쓰고 나에게 쓰지말지를 졸랐으니, 나는 내가 완전히 가이드가 몇년간 받은 모든 칭찬에 완전히 감사하다는 것을 알게해주고 싶다. 그것은 정말 나의 사기를 증진시켜주고, 좋게 사용되고 있다는 것을 듣는 것은 나를 기쁘게 한다. 고맙다.

1.7 Mirroring
이 사이트를 복사하는 것은 매우 환영한다. 그것이 공적이든 사적이든. 만약 너가 공연히 사이트를 복사하고 싶고, 메인 페이지로부터 그것을 내가 링크하고자 한다면, 내 메일에 한 줄 남겨라.

1.8 Note for Translators
만약 너가 가이드를 다른 언어로 번역하고 싶다면, 메일로 보내라. 그러면 나는 너의 번열을 메인페이지에서 링크할 것이다. 편하게 너의 이름과 연락 정보를 번역에 추가해라.

아래에 있는 Copyright와 Distribution에서 라이센스 제한에 유의해라.

만약 너는 내가 translation을 호스트하길 원한다면 그냥 물어라. 너가 호스트하길 원한다면 나는 그것을 링크할 것이다. 어떤 방식이든 괜찮다.

1.9 Copyright and Distribution
소스코드와 번역에 대해 특정한 예외와 함께, 아래의 이 작업은 Creative Commons Attribution - NOncommercial - NoDerivative Works3.0 License 하에 라이센스가 되어있다. 이 라이센스의 복사본을 보려면 주소를 방문하거나 여기로 레터를 보내라.

그 라이센스의 No Derivative Works에 대한 한 가지 특정한 예외는 다음과 같다: 이 가이드는 자유롭게 어떤 언어로 번역되어질 지도 모른다. 번역이 정확하다면, 그리고 그 가이드는 그것의 전체에서 다시 프린트 되어야 한다. 같은 라이센스 제한은 원래 가이드에 대한 번역에 적용된다. 번역은 또한 번역가의 이름과 연락정보를 가질지도 모른다.

이 문서에 있는 C 소스코드는 public domain으로서 쓰여진다. 그리고 완전히 어떤 라이센스 제한이 없다.

교육자들은 그들의 학생들에게 이 가이드의 복사본을 추천하거나 공급하는데 자유롭게 격려된다.

더 많은 정보는 메일로 보내라.

댓글 없음:

댓글 쓰기