질문&답변
클라우드/리눅스에 관한 질문과 답변을 주고 받는 곳입니다.
리눅스 분류

주석설명 부탁드립니다.

작성자 정보

  • 절대빛 작성
  • 작성일

컨텐츠 정보

본문

TCP/IP 관련 통신 소스입니다.
주석이 조금나와있긴하나, 조금 더 자세히 알고 싶어서
고수분들의 도움의 손길을 요청합니다.

우선 서버쪽입니다.
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 7777   /* 포트 번호 */
#define MAXPENDING 5   /* 클라이언트 요구가 대기하는 큐의 크기 */
#define BUFSIZE 1024   /* recvBuffer의 크기 */

main()
{
    int servSockfd;
    int clntSockfd;
    struct sockaddr_in servAddr;
    struct sockaddr_in clntAddr;
    char recvBuffer[BUFSIZE];
    int clntLen;
    int recvLen;

    /* 인터넷으로 연결된 프로세스들 간에 통신을 하고 TCP 방법을 이용하는 소켓을 생성 */
    if((servSockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1) {
       perror("sock failed");
       exit(1);
    }

    /* servAddr를 0으로 초기화 */
    memset(&servAddr, 0, sizeof(servAddr));
    /* servAddr에 IP 주소와 포트 번호를 저장 */
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(PORT);

    /* servSockfd 소켓에 주소 정보 연결 */
    if(bind(servSockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) {
       perror("bind failed");
       exit(1);
    }

    /* servSockfd으로 들어오는 클라이언트 요청 기다림 */
    if(listen(servSockfd, MAXPENDING) == -1) {
       perror("listen failed");
       exit(1);
    }

    /* 무한 반복 */
    while(1) {
       clntLen = sizeof(clntAddr);
       /* servSockfd으로 들어오는 클라이언트의 요청을 받아들임 */
       if((clntSockfd=accept(servSockfd, (struct sockaddr*)&clntAddr, &clntLen)) == -1) {
          perror("accept failed");
          exit(1);
       }
       /* 한 클라이언트에 대해 반복 */
       while(1) {
          /* clntSockfd 소켓으로 들어오는 데이터를 받아 recvBuffer에 저장 */
          if((recvLen=recv(clntSockfd, recvBuffer, BUFSIZE-1, 0)) == -1) {
             perror("recv failed");
             exit(1);
          }
          /* 클라이언트가 연결을 끊으면 recv는 0을 반환 */
          if(recvLen == 0)
             break;

          recvBuffer[recvLen] = '';
          /* 받은 데이터를 출력 */
          printf("Recevied: %s ", recvBuffer);

          /* 받은 데이터를 클라이언트에게 보냄 */
          if(send(clntSockfd, recvBuffer, recvLen, 0) != recvLen) {
             perror("send failed");
             exit(1);
          }
       }
       /* clntSockfd 소켓을 닫음 */
       close(clntSockfd);
    }
}


클라이언트쪽입니다.

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 7777   /* 서버의 포트 번호 */
#define BUFSIZE 1024

/* argv[1]은 수와 점 표기의 IP 주소 */
main(int argc, char *argv[])
{
    int sockfd;
    struct sockaddr_in servAddr;
    char sendBuffer[BUFSIZE], recvBuffer[BUFSIZE];
    int recvLen;

    if(argc != 2) {
       fprintf(stderr, "Usage: %s IP_address ", argv[0]);
       exit(1);
    }

    /* 소켓 생성 */
    if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1) {
       perror("sock failed");
       exit(1);
    }

    memset(&servAddr, 0, sizeof(servAddr));
    /* servAddr에 IP 주소와 포트 번호를 저장 */
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr(argv[1]);
    servAddr.sin_port = htons(PORT);

    /* servAddr 서버에 통신을 요청 */
    if(connect(sockfd, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) {
       perror("connect failed");
       exit(1);
    }

    /* quit를 입력 받을 때까지 반복 */
    while(1) {
       printf("Input sending message ==> ");
       fgets(sendBuffer, BUFSIZE, stdin);
       if(!strncmp(sendBuffer, "quit", 4))
          break;

       /* sockfd 소켓을 통해 데이터를 보냄 */
       if(send(sockfd, sendBuffer, strlen(sendBuffer), 0) != strlen(sendBuffer)) {
          perror("send failed");
          exit(1);
       }

       /* sockfd 소켓을 통해 들어오는 데이터를 받아 recvBuffer에 저장 */
       if((recvLen=recv(sockfd, recvBuffer, BUFSIZE-1, 0)) <= 0) {
          perror("recv failed");
          exit(1);
       }

       recvBuffer[recvLen] = '';
       /* 받은 데이터를 출력 */
       printf("Recevied: %s ", recvBuffer);
    }
    /* sockfd 소켓을 닫음 */
    close(sockfd);
    exit(0);
}

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,138 명
  • 현재 강좌수 :  36,196 개
  • 현재 접속자 :  572 명