logo

C/C++의 소켓 프로그래밍

오늘날 세계에서 컴퓨터 네트워크는 데이터 전송 분야에서 중요한 역할을 합니다. 프로그래머라면 누구나 알아야 할 주제이다. 컴퓨터 네트워크에서 소켓 프로그래밍은 프로그래밍 세계에서 가장 중요한 주제 중 하나입니다. 이 주제에서는 소켓 프로그래밍과 C++에서 구현되는 다양한 소켓 프로그래밍 방법에 대해 논의합니다.

정렬 알고리즘 병합 정렬

C++에서 소켓 프로그래밍은 두 개 이상의 노드를 네트워크를 통해 서로 결합하여 노드가 데이터 손실 없이 데이터를 공유할 수 있도록 하는 방법입니다. 이 연결에서 하나의 노드는 특정 IP 주소에 연결된 하나의 포트를 수신합니다. 클라이언트가 서버에 도달하면 서버는 소켓 수신기를 만듭니다.

소켓이란 무엇입니까?

실시간 예제를 통해 소켓에 대해 알아봅시다. 소켓은 두 장치 간의 연결을 제공하는 매체 유형입니다. 소켓은 소켓과 전화기 또는 전화기와 해당 노트북 사이의 연결을 제공하는 전화기 충전기일 수 있습니다. 소켓을 사용하면 다양한 애플리케이션이 다양한 포트를 통해 로컬 네트워크에 연결됩니다. 소켓이 생성될 때마다 서버는 프로그램을 지정하고 해당 프로그램은 소켓과 도메인 주소를 지정합니다.

소켓은 서로 다른 프로세스 간에 데이터를 교환하는 데 사용되는 일종의 메커니즘입니다. 여기서 이러한 프로세스는 다른 장치 또는 네트워크를 통해 연결된 동일한 장치에 존재합니다. 소켓에 대한 연결이 생성되면 데이터는 양방향으로 전송될 수 있으며 끝점 중 하나가 연결을 닫을 때까지 계속됩니다.

C/C++의 소켓 프로그래밍

클라이언트-서버 통신 절차

클라이언트-서버 통신을 설정하려면 따라야 하는 몇 가지 절차가 있습니다. 이는 다음과 같습니다.

    소켓:소켓의 도움으로 우리는 새로운 통신을 생성할 수 있습니다.묶다:이를 통해 소켓에 로컬 주소를 연결할 수 있습니다.듣다:이 도움으로; 우리는 연결을 받아들일 수 있습니다.수용하다:이 도움으로; 요청이 도착할 때까지 들어오는 연결을 차단할 수 있습니다.연결하다:이 도움으로; 연결을 시도할 수 있습니다.보내다:이것의 도움으로; 네트워크를 통해 데이터를 보낼 수 있습니다.받다:이 도움으로; 네트워크를 통해 데이터를 수신할 수 있습니다.닫다:이를 통해 네트워크 연결을 해제할 수 있습니다.

서버 소켓 생성 단계

서버용 소켓을 생성할 수 있는 몇 가지 단계가 있습니다. 이는 다음과 같습니다.

    int 소켓cr:소켓(도메인, 유형, 프로토콜)소켓cr:정수형이며 파일 핸들러와 같습니다.도메인:통신 도메인이며 정수형입니다.유형:통신형입니다.SOCK_DGRAM:이는 신뢰할 수 없고 연결이 없는 UDP 유형입니다.규약:IP 주소에 대한 프로토콜 값인 0을 할당하는 데 사용됩니다. 프로토콜 값은 포켓의 IP 헤더의 프로토콜 필드에 나타나는 값과 유사합니다.

연결이란 무엇입니까?

연결은 두 소프트웨어가 서로에 대해 알려진 두 시스템 간의 관계 유형입니다. 이 두 소프트웨어는 서로 연결하는 방법을 알고 있습니다. 즉, 이 두 소프트웨어는 네트워크를 통해 비트를 보내는 방법을 알고 있다고 말할 수 있습니다. 소켓 연결은 두 시스템이 전화번호, IP 주소 및 TCP 포트와 같은 서로 간의 모든 정보를 알아야 함을 의미합니다.

소켓은 프로그램이 들어오는 연결을 수락하고 들어오는 연결을 보내거나 받을 수 있도록 하는 파일과 유사한 개체 유형입니다. 또한 서버의 프로세스에 할당된 자원의 일종이다.

서버는 소켓()의 도움으로 소켓을 생성할 수 있습니다. 이 소켓은 다른 프로세서와 공유할 수 없습니다.

자바의 char + int
    Setockopt:Setockopt의 도움으로 소켓의 파일 설명자가 참조하는 소켓의 다양한 옵션을 조작할 수 있습니다. 이 프로세스는 전적으로 선택 사항입니다. Setockopt의 도움으로 클라이언트와 서버의 포트와 주소를 재사용할 수 있습니다. 서버에서 '이미 사용 중인 주소'라는 오류가 표시되면 Setockopt의 도움으로 이를 방지할 수 있습니다.묶다:바인딩 함수를 사용하여 주소와 포트로 소켓을 바인딩할 수 있습니다. 이 작업은 소켓 생성 후에 수행됩니다. 예를 들어 서버를 로컬 호스트와 바인딩하려고 하면 INADDR_ANY를 사용하여 서버의 IP 주소를 정의합니다.듣다:Listening() 함수를 사용하여 연결 모드 소켓을 만들 수 있습니다. 연결 모드 소켓의 예는 SOCK_STREAM입니다. 이는 소켓 인수로 정의할 수 있습니다. 이는 들어오는 연결을 수락하고 들어오는 연결에 대한 대기열 작업을 수행하고 들어오는 연결의 백로그를 수행하는 데 사용됩니다. 들어오는 연결이 서버에 승인을 요청하면 소켓은 수동 모드로 전환됩니다. 서버의 backlog 매개변수는 서버에 대해 한 번에 둘 이상의 연결을 허용할 수 없다는 사실을 나타냅니다. 들어오는 연결이 들어오고 대기열이 가득 찬 경우 서버는 'ECONNREFUSED' 표시와 함께 오류를 제공합니다. Listen()의 도움으로 들어오는 연결이 보류되고 대기열이 비어 있으면 들어오는 모든 연결을 서버로 호출합니다.수용하다:accept() 시스템 호출의 도움으로; 연결 기반 소켓을 만들 수 있습니다. 일부 연결 기반 소켓은 SOCK_STREAMan 및 SOCK_SEQPACKET입니다. 먼저 들어오는 모든 들어오는 연결을 추출하고 해당 요청이 서버로 전달되도록 허용합니다. 새로 연결된 목록은 새 소켓 생성을 위한 다른 인수의 도움을 받을 수 없습니다.

클라이언트를 위한 단계

    소켓 연결:서버 생성 방법과 똑같습니다.연결하다:connect() 시스템 호출을 사용하여 소켓에 대한 연결을 시작할 수 있습니다. 소켓에 대한 매개변수가 SOCK_DGRAM 유형인 경우 connect()를 사용하여 데이터그램을 영구적으로 정의할 수 있습니다. 소켓이 SOCK_STREAM 유형이면 서버에 대한 다른 연결을 시도할 수 있습니다. connect() 함수의 도움으로 외국 협회에 대한 연결을 만들 수도 있습니다. 소켓이 바인딩 해제된 경우 시스템은 로컬 연결에 고유한 값을 할당합니다. 시스템이 성공적으로 완료를 호출하면 소켓은 모든 유형의 데이터를 보내거나 받을 준비가 됩니다.보내기/받기:send() 및 recv() 함수는 아래 작업을 수행할 수 있습니다.
  • 데이터를 서로 통신할 수 있는 소켓입니다.
  • 스토리지 버퍼는 addr_of_data 및 addr_of_buffer와 같은 주소에 대한 데이터를 저장할 수 있습니다.
  • len_of_data 및 len_of_buffer와 같은 버퍼 크기를 처리합니다.
  • 데이터가 전송되는 방법을 알려주는 플래그를 다룹니다.

소켓에서 연결을 설정하는 단계

이는 다른 클라이언트와 서버 간의 연결을 설정합니다. 그러나 클라이언트와 서버 모두 소켓 연결을 처리할 수 있습니다. 각 프로세스는 자신의 소켓에 대한 연결을 설정해야 합니다.

클라이언트 측에서 소켓을 설정하는 단계는 다음과 같습니다.

  • 소켓() 시스템 호출을 사용하여 소켓을 생성합니다.
  • 그런 다음 system() 호출을 사용하여 서버의 소켓 주소에 연결해야 합니다.
  • 그런 다음 데이터를 보내고 받아야 합니다. 우리는 이것을 다양한 방법으로 할 수 있습니다. 우리는 read()와 write() 함수를 사용할 수 있습니다.

서버 측에서 소켓을 설정하는 단계는 다음과 같습니다.

  • 먼저 소켓() 시스템 호출을 사용하여 소켓을 생성합니다.
  • 그런 다음 바인딩() 시스템 호출을 사용하여 소켓을 주소에 바인딩합니다. 주소는 호스트 시스템의 서버 소켓에 대한 포트 번호로 구성됩니다.
  • 그런 다음 listening () 시스템 호출을 사용하여 연결을 수신합니다.
  • 그런 다음 서버는 accept() 시스템 호출을 통해 들어오는 연결을 수락합니다. 또한 클라이언트가 서버에 연결될 때까지 들어오는 모든 명령을 차단합니다.
  • 그런 다음 데이터 전송 및 수신 프로세스가 시작됩니다.

멀티스레딩 없이 여러 클라이언트 연결

단일 사용자가 서버에 연결하는 방법을 보여주는 다양한 예가 있습니다. 오늘날의 프로그래밍 세계에서는 여러 사용자가 서로 다른 소켓을 사용하여 서버에 연결됩니다.

이를 달성하는 방법에는 여러 가지가 있습니다. 그 중 하나가 멀티스레딩입니다. 멀티스레딩의 도움으로 이를 달성할 수 있습니다. select() 함수를 사용하여 멀티스레딩 프로세스를 구현할 수 있습니다.

예:

클라이언트용 코드:

 // Client side C/C++ program to demonstrate Socket // programming #include #include #include #include #include #define PORT 8080 int main(int argc, char const* argv[]) { int sock = 0, valread, client_fd; struct sockaddr_in serv_addr; char* hello = &apos;Hello from client&apos;; char buffer[1024] = { 0 }; if ((sock = socket(AF_INET, SOCK_STREAM, 0)) <0) 0 8080 { printf('
 socket creation error 
'); return -1; } serv_addr.sin_family="AF_INET;" serv_addr.sin_port="htons(PORT);" convert ipv4 and ipv6 addresses from text to binary form if (inet_pton(af_inet, '127.0.0.1', &serv_addr.sin_addr) <="0)" printf( '
invalid address not supported ((client_fd="connect(sock," (struct sockaddr*)&serv_addr, sizeof(serv_addr))) 0) printf('
connection failed send(sock, hello, strlen(hello), 0); printf('hello message sent
'); valread="read(sock," buffer, 1024); printf('%s
', buffer); closing the connected close(client_fd); 0; code for server: server side c c++ program demonstrate programming #include #define port int main(int argc, char const* argv[]) server_fd, new_socket, valread; struct sockaddr_in address; opt="1;" addrlen="sizeof(address);" buffer[1024]="{" }; char* hello="Hello from server" ; creating file descriptor ((server_fd="socket(AF_INET," sock_stream, 0)) perror('socket failed'); exit(exit_failure); forcefully attaching (setsockopt(server_fd, sol_socket, so_reuseaddr | so_reuseport, &opt, sizeof(opt))) perror('setsockopt'); address.sin_family="AF_INET;" address.sin_addr.s_addr="INADDR_ANY;" address.sin_port="htons(PORT);" (bind(server_fd, sockaddr*)&address, sizeof(address)) perror('bind (listen(server_fd, 3) perror('listen'); ((new_socket="accept(server_fd," (socklen_t*)&addrlen)) perror('accept'); send(new_socket, close(new_socket); listening shutdown(server_fd, shut_rdwr); pre> <p> <strong>Compiling:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-2.webp" alt="Socket Programming in C/C++"> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/33/socket-programming-c-c-3.webp" alt="Socket Programming in C/C++"> <h2>Uses of Socket Programming</h2> <p>Socket programs are used to communicate between various processes, usually running on different systems. It is mostly used to create a client-server environment. This post provides the various functions used to create the server and client program and an example program.</p> <p>In the example, the client program sends a file name to the server, and the server sends the contents of the file back to the client. Socket programming usually pertains to basic communication protocols like TCP/UDP and raw sockets like ICMP. These protocols have a small communication overhead when compared to underlying protocols such as HTTP/DHCP/SMTP etc.</p> <p> <strong>Some of the basic data communications between the client and server are:</strong> </p> <ul> <li>File Transfer: Sends name and gets a file.</li> <li>Web Page: Sends URL and gets a page.</li> <li>Echo: Sends a message and gets it back.</li> </ul> <h2>Disadvantages</h2> <ul> <li>C++ can establish communication only with the machine requested and not with any other machine on the network.</li> <li>Sockets allow only raw data to be sent. This means that the client and server need mechanisms to interpret the data.</li> </ul> <hr></0)>