Visual C++ > Tip&Tech > [리눅스 C]소켓을 이용한 TCP 통신. 서버&클라이언트 기초
 
C/C++
Library
Tip&Tech
Q&A
 
 
Tip&Tech
  HOME > Visual C++ > Tip&Tech
 
작성일 : 10-08-10 20:43
[리눅스 C]소켓을 이용한 TCP 통신. 서버&클라이언트 기초
 글쓴이 : 덩벙이 (211.♡.155.10)
조회 : 9,152   추천 : 0   비추천 : 0  

서버의 로직

 

1. 서버용 소켓 디스크립터 만들기(socket)

2. 서버로 만들 포트와 방식 설정을 위한 sockaddr_in 구조체 만들기

      (클라이언트와 다른건 htonl(INADDR_ANY))

3. 서버용 소켓 바인딩 시키기(bind)

4. 리스튼으로 클라이언트 접속을 기다림(listen)

5. accept함수로 클라이언트가 접속하면, 클라이언트용 소켓 디스크립터 생성(accept)

6. 클라이언트 소켓으로 메시지를 쓴다(write)

7. 클라이언트 소켓으로부터 메시지를 읽는다.(read)

 

클라이언트의 로직

 

1. 서버에 접속할 소켓 디스크립터 만들기(socket)

2. 접속할 서버의 주소와 포트번호, 접속 방식을 sockaddr_in 구조체에 집어 넣는다.

3. sockaddr_in 구조체의 정보로 소켓 접속(conncet)

4. 연결됐으면, 우선 소켓에서 읽어온다.

5. 그리고 쓴다.

 

 

---서버코드---

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/socket.h>

#include <sys/stat.h>

#include <arpa/inet.h>

 

#define MAXBUF 256

 

int main()

{

        int ssock, csock;

        int clen;

        struct sockaddr_in client_addr, server_addr;

        char buf[MAXBUF] = "Im server connecting success.";

       

        //make server socket

        if((ssock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)

        {       perror("Failed to make socket discriptor");

               exit(1);

        }

       

        clen = sizeof(client_addr);

       

        //setting address structure

        memset(&server_addr, 0, sizeof(server_addr));

        server_addr.sin_family = AF_INET;

        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

        server_addr.sin_port = htons(3317);

       

    //binding

   if(bind(ssock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)

   {       perror("Failed to binding server socket");

           exit(1);

   }

       

 

        //wait for client

        if(listen(ssock, 8) <0 )

        {       perror("listen error : ");

               exit(1);

        }

       

        char readbuf[MAXBUF];

        memset(&readbuf, 0, MAXBUF);

       

        int i=0;

        while(1)

        {     csock = accept(ssock, (struct sockaddr *)&client_addr, &clen);

               i++;

              

               if(write(csock, buf, MAXBUF) <= 0)

                       perror("Writing error : ");

                      

               if(read(csock, readbuf, MAXBUF) < 0)

                       perror("Reading error : ");

                      

               fprintf(stderr, "[client] %s\n", readbuf);

                      

               close(csock);

       

        }

        return 0;

}

 

 

---클라이언트 코드---

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <sys/socket.h>

#include <sys/stat.h>

#include <arpa/inet.h>

 

#define MAXBUF 256

 

int main()

{

        int ssock;

        int clen;

        struct sockaddr_in server_addr;

        char buf[MAXBUF];

       

        //Make socket

        if((ssock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)

        {       perror("Failed to make socket descriptor");

               exit(1);

        }

       

        clen = sizeof(server_addr);

       

        //set connected address for socket

        memset(&server_addr, 0, sizeof(clen));

        server_addr.sin_family = AF_INET;

        server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

        server_addr.sin_port = htons(3317);

       

        //connect to setted address

        if(connect(ssock, (struct sockaddr *)&server_addr, clen) < 0 )

        {       perror("Failed to connect socket");

               exit(1);

        }

       

        memset(buf, 0, MAXBUF);

        int readbytes;

       

        //read socket

        if(readbytes = read(ssock, buf, MAXBUF) <= 0)

        {       perror("Failed to read socket");

               exit(1);

        }

       

        char writebuf[MAXBUF] = "Im client! Hi~ server~";

 

        if(write(ssock, writebuf, sizeof(writebuf)) < 0)

               perror("Failed to writing");

       

        close(ssock);

       

        //print to screen

        printf("\n[read] : %s\n\n", buf);

  &nb


 
 

Total 66,696
번호 제   목 글쓴이 날짜 추천 비추천 조회
66696 리눅스용 비동기 소켓 클래스 덩벙이 08-10 0 0 5723
66695 mysql 연동 C 프로그래밍 덩벙이 08-10 0 0 5112
66694 [리눅스 C]소켓을 이용한 TCP 통신. 서버&클라이언트 기초 덩벙이 08-10 0 0 9153
66693 리눅스사용시 참조 => 리눅스에서 컴파일시 sqrt(), atan(), … 덩벙이 05-27 0 0 5511
66692 [C] strlen, strcmp, strcpy, strcat 직접 작성하기 덩벙이 05-26 0 0 5508
66691 리눅스사용시 참조 => 입력버퍼 비우기 fflush(stdin) MS VS … 덩벙이 05-25 0 0 7498
66690 문자열 다루기 (복사, 합치기, 비교하기) 덩벙이 05-14 0 0 10506
66689 간단한 if문 덩벙이 04-24 0 0 5138
 1  2  3  4  5  6  7  8  9  10    
 
개인홈페이지 덤벙닷컴은 프로그래머와 디자이너위한 IT커뮤니티 공간입니다.
Copyright ⓒ www.dumbung.com. All rights reserved.