간단한 리눅스에서 socket 프로그램

24784 단어
C 언어 강좌와 마찬가지로 우리는 간단한 "Hello World!"프로그램이 socket 프로그래밍에 삽입되었습니다.
이 섹션에서는 Linux의 코드, 서버를 보여 줍니다.cpp는 서버 사이드 코드,client.cpp는 클라이언트 코드입니다. 클라이언트가 서버에서 문자열을 읽고 출력하는 기능입니다.
서버측 코드 서버.cpp:

    
    
    
    
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <arpa/inet.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. int main(){
  9. //
  10. int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  11. // IP、
  12. struct sockaddr_in serv_addr;
  13. memset(&serv_addr, 0, sizeof(serv_addr));  // 0
  14. serv_addr.sin_family = AF_INET; // IPv4
  15. serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP
  16. serv_addr.sin_port = htons(1234); //
  17. bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
  18. // ,
  19. listen(serv_sock, 20);
  20. //
  21. struct sockaddr_in clnt_addr;
  22. socklen_t clnt_addr_size = sizeof(clnt_addr);
  23. int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
  24. //
  25. char str[] = "Hello World!";
  26. write(clnt_sock, str, sizeof(str));
  27. //
  28. close(clnt_sock);
  29. close(serv_sock);
  30. return 0;
  31. }

클라이언트 코드client.cpp:

    
    
    
    
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <arpa/inet.h>
  6. #include <sys/socket.h>
  7. int main(){
  8. //
  9. int sock = socket(AF_INET, SOCK_STREAM, 0);
  10. // ( IP )
  11. struct sockaddr_in serv_addr;
  12. memset(&serv_addr, 0, sizeof(serv_addr)); // 0
  13. serv_addr.sin_family = AF_INET; // IPv4
  14. serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // IP
  15. serv_addr.sin_port = htons(1234); //
  16. connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
  17. //
  18. char buffer[40];
  19. read(sock, buffer, sizeof(buffer)-1);
  20. printf("Message form server: %s
    ", buffer);
  21. //
  22. close(sock);
  23. return 0;
  24. }

서버를 먼저 컴파일합니다.cpp 및 실행:
[admin@localhost ~]$ g++ server.cpp -o server [admin@localhost ~]$ ./server |
정상적으로 프로그램이 accept () 함수로 실행되면 클라이언트가 요청할 때까지 막힙니다.
다음client를 컴파일합니다.cpp 및 실행:
[admin@localhost ~]$ g++ client.cpp -o client [admin@localhost ~]$ ./client Message form server: Hello World! [admin@localhost ~]$
client가 실행된 후 connect () 함수를 통해 서버에 요청을 하고 감청 상태의 서버가 활성화되며 accept () 함수를 실행하고 클라이언트의 요청을 받은 다음 write () 함수를 실행하여client에 데이터를 전송합니다.client가 전송된 데이터를 받은 후,connect () 가 실행되고,read () 를 사용하여 데이터를 읽습니다.
주의해야 할 점:
1) 서버는 client 요청을 한 번만 받아들인다. 서버가 client에 데이터를 전송하면 프로그램이 끝난다.서버의 데이터를 다시 받으려면 서버를 다시 실행해야 하기 때문에 이것은 매우 초라한 socket 프로그램으로 클라이언트의 요청을 계속 받아들일 수 없습니다.
2) 위의 소스 파일 접미사는.cpp
, C++ 코드이므로g++
명령을 컴파일하다.
C++와 C언어의 중요한 차이점은 다음과 같다. C언어에서 변수는 함수의 첫머리에 정의해야 한다.C++에서는 함수의 어느 곳에서든 변수를 정의할 수 있어 더욱 유연하게 사용할 수 있다.여기서 C++ 코드를 사용하는 이유는 함수 첫머리에 너무 많은 변수를 쌓는 것을 원하지 않기 때문입니다.
원본 코드 해석
1) 서버에 대해 먼저 설명합니다.cpp의 코드입니다.
11 줄은 socket () 함수를 통해 플러그인을 만들었습니다. 인자AFINET는 IPv4 주소 사용, SOCK 를 나타냅니다.STREAM은 연결을 위한 데이터 전송 방식을 사용하는 IPPROTO 를 나타냅니다.TCP 는 TCP 프로토콜을 사용하는 것을 나타냅니다.Linux에서 socket도 파일 설명자가 있고 write ()/read () 함수로 입출력을 할 수 있습니다.
19번째 줄은bind() 함수를 통해 소켓 서버sock은 특정한 IP 주소와 포트와 연결되며 IP 주소와 포트는 sockaddr 에 저장됩니다인 구조체 중.
cket () 함수는 플러그인의 각종 속성을 확정하고bind () 함수는 플러그인을 특정한 IP 주소와 포트에 대응시켜야 클라이언트가 이 플러그인에 연결할 수 있습니다.
22행은 소켓을 수동 감청 상태로 설정합니다.수동 감청이란 클라이언트가 요청을 해야 깨어날 때까지 플러그인이 '수면' 상태에 있는 것을 말한다.
27 줄의 accept () 함수는 클라이언트의 요청을 받는 데 사용됩니다.프로그램이 accept () 에 실행되면 클라이언트가 요청할 때까지 차단됩니다.
31줄의 write () 함수는 플러그인 파일에 데이터를 쓰는 데 사용됩니다. 즉 클라이언트에게 데이터를 보내는 것입니다.
일반 파일과 마찬가지로, socket은 사용이 끝난 후에도 close () 로 닫아야 합니다.
2)다시 한 번 client.cpp의 코드입니다.client.cpp의 코드와 서버.cpp에는 약간의 차이가 있습니다.
19행 코드는connect()를 통해 서버에 요청을 하고 서버의 IP 주소와 포트 번호는 sockaddr 에 저장합니다인 구조체 중.서버가 데이터를 전송한 후에야 connect () 가 실행됩니다.
23행 코드는read () 를 통해 플러그인 파일에서 데이터를 읽습니다.

좋은 웹페이지 즐겨찾기