You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 리눅스 소켓 프로그래밍 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://toplist.maxfit.vn team, along with other related topics such as: 리눅스 소켓 프로그래밍 C 소켓 프로그래밍, 소켓 프로그래밍 로그인, 소켓프로그래밍 책, 소켓 서버, 소켓 프로그래밍 파이썬, 소켓 프로그래밍 C, 자바 소켓 프로그래밍, 서버/클라이언트 프로그래밍
[Network][TCP/IP] 소켓 구현(1)_ 리눅스 서버 구현 :: A Long Life
- Article author: aronglife.tistory.com
- Reviews from users: 37563 Ratings
- Top rated: 4.4
- Lowest rated: 1
- Summary of article content: Articles about [Network][TCP/IP] 소켓 구현(1)_ 리눅스 서버 구현 :: A Long Life – socket 함수는 어떤 프로토콜을 가진 소켓으로 통신할 것인지 결정하여 생성하는 함수이다. #include
int socket( int … … - Most searched keywords: Whether you are looking for [Network][TCP/IP] 소켓 구현(1)_ 리눅스 서버 구현 :: A Long Life – socket 함수는 어떤 프로토콜을 가진 소켓으로 통신할 것인지 결정하여 생성하는 함수이다. #include
int socket( int … 본 글은 윤성우의 TCP/IP 소켓 프로그래밍을 참고하였습니다. 순서 I. 소켓 프로그래밍 절차 II. 서버 호출 함수 정보 socket() – bind() – listen() – accept() – read()/write() – close() III. 서버 전체 구현..Aron’s SW work & Travel life Balance - Table of Contents:
I 소켓 프로그래밍 절차
II 서버 호출 함수 정보
III 서버 전체 구현 코드
티스토리툴바
REAKWON :: [리눅스] 소켓(socket) 개념과 예제(connect, bind, listen, accept,send,recv 사용)
- Article author: reakwon.tistory.com
- Reviews from users: 4561 Ratings
- Top rated: 3.3
- Lowest rated: 1
- Summary of article content: Articles about REAKWON :: [리눅스] 소켓(socket) 개념과 예제(connect, bind, listen, accept,send,recv 사용) 네트워크 통신을 하는 표준 방법으로 프로세스간 연결의 종점이라고 볼 수 있습니다. 기본적인 개념은 아래의 그림과 같습니다. 위의 그림은 TCP/IP에서의 … …
- Most searched keywords: Whether you are looking for REAKWON :: [리눅스] 소켓(socket) 개념과 예제(connect, bind, listen, accept,send,recv 사용) 네트워크 통신을 하는 표준 방법으로 프로세스간 연결의 종점이라고 볼 수 있습니다. 기본적인 개념은 아래의 그림과 같습니다. 위의 그림은 TCP/IP에서의 … 소켓(socket) 네트워크 통신을 하는 표준 방법으로 프로세스간 연결의 종점이라고 볼 수 있습니다. 기본적인 개념은 아래의 그림과 같습니다. 위의 그림은 TCP/IP에서의 인터넷 통신을 보여줍니다. 클라이언트의..
- Table of Contents:
티스토리툴바
[소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드
- Article author: jhnyang.tistory.com
- Reviews from users: 12533 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about [소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드 [소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드. 양햄찌(jhnyang) 2020. 4. 6. 16:57. …
- Most searched keywords: Whether you are looking for [소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드 [소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드. 양햄찌(jhnyang) 2020. 4. 6. 16:57. 안녕하세요~! 오늘은 기본적인 TCP 서버 프로그램을 작성해볼게요. 소켓 프로그래밍으로 간단한 채팅 서버를 만들어볼 생각인데, 찬찬히 진행해보도록 합시다. 소켓 프로그래밍이란? 오늘날 모든 컴퓨터는 소통을..
- Table of Contents:
소켓 프로그래밍이란
소켓 socket
서버를 만들기 위한 절차
서버 만드는데 필요한 함수
C언어 서버 프로그램
서버 실행후 클라이언트 접속해보기
태그
‘별걸다하는 IT네트워크_소켓_통신’ Related Articles
티스토리툴바
4. 소켓 네트워크 프로그램 개발 – 9, 10. 소켓 프로그램(linux)
- Article author: codingfarm.tistory.com
- Reviews from users: 24537 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about 4. 소켓 네트워크 프로그램 개발 – 9, 10. 소켓 프로그램(linux) 이제 리눅스 환경에서의 소켓 클라이언트 프로그램을 작성해본다 클라이언트가 보낸 문자열을 서버에서 받아, 고스란히 되돌려주는 에코 프로그램을 … …
- Most searched keywords: Whether you are looking for 4. 소켓 네트워크 프로그램 개발 – 9, 10. 소켓 프로그램(linux) 이제 리눅스 환경에서의 소켓 클라이언트 프로그램을 작성해본다 클라이언트가 보낸 문자열을 서버에서 받아, 고스란히 되돌려주는 에코 프로그램을 … 이제 리눅스 환경에서의 소켓 클라이언트 프로그램을 작성해본다 클라이언트가 보낸 문자열을 서버에서 받아, 고스란히 되돌려주는 에코 프로그램을 작성해보자 포트번호는 3500으로 할것이다. 컴퓨터가 두대라면..
- Table of Contents:
codingfarm
4 소켓 네트워크 프로그램 개발 – 9 10 소켓 프로그램(linux) 본문
클라이언트 프로그램
서버 프로그램
리눅스 소켓 프로그래밍 09 : TCP 서버 프로그램 예제
- Article author: luckyyowu.tistory.com
- Reviews from users: 43253 Ratings
- Top rated: 3.7
- Lowest rated: 1
- Summary of article content: Articles about 리눅스 소켓 프로그래밍 09 : TCP 서버 프로그램 예제 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 PDF 파일을 토대로 작성되었습니다. * 개인공부 후 자료를 남기기 위한 목적 … …
- Most searched keywords: Whether you are looking for 리눅스 소켓 프로그래밍 09 : TCP 서버 프로그램 예제 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 PDF 파일을 토대로 작성되었습니다. * 개인공부 후 자료를 남기기 위한 목적 … * 본 포스팅은 한국소프트웨어진흥원 출처의 리눅스 네트워크 프로그래밍 PDF 파일을 토대로 작성되었습니다. * 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있음을 밝힙니다. 이번에는..흔하디 흔한 컴공 공돌이 마음대로 끄적이는 개발 및 개인 블로그
- Table of Contents:
티스토리 뷰
Yowu (Yu Yongwoo)
[ 리눅스 ] 네트워크 소켓 프로그래밍으로 파일 다운로드/업로드 클라이언트, 서버 만들기
- Article author: codingwell.tistory.com
- Reviews from users: 47248 Ratings
- Top rated: 4.6
- Lowest rated: 1
- Summary of article content: Articles about [ 리눅스 ] 네트워크 소켓 프로그래밍으로 파일 다운로드/업로드 클라이언트, 서버 만들기 리눅스에서 네트워크 소켓 프로그래밍을 이용해 파일을 다운로드하고 업로드할 수 있는 클라이언트와 서버를 만들어보았다. – 파일 전송 서버는 서버 … …
- Most searched keywords: Whether you are looking for [ 리눅스 ] 네트워크 소켓 프로그래밍으로 파일 다운로드/업로드 클라이언트, 서버 만들기 리눅스에서 네트워크 소켓 프로그래밍을 이용해 파일을 다운로드하고 업로드할 수 있는 클라이언트와 서버를 만들어보았다. – 파일 전송 서버는 서버 … 리눅스에서 네트워크 소켓 프로그래밍을 이용해 파일을 다운로드하고 업로드할 수 있는 클라이언트와 서버를 만들어보았다. – 파일 전송 서버는 서버에서 실행중이며 클라이언트가 다운받고자 하는 파일을 전송하..
- Table of Contents:
티스토리 뷰
티스토리툴바
[리눅스][소켓 통신] 채팅 프로그램 만들기 – 1. 완성본 구경 : 네이버 블로그
- Article author: m.blog.naver.com
- Reviews from users: 20418 Ratings
- Top rated: 4.6
- Lowest rated: 1
- Summary of article content: Articles about [리눅스][소켓 통신] 채팅 프로그램 만들기 – 1. 완성본 구경 : 네이버 블로그 [리눅스][소켓 통신] 채팅 프로그램 만들기 – 1. … #include
#include typedef struct recieve_data{ char* message; … … - Most searched keywords: Whether you are looking for [리눅스][소켓 통신] 채팅 프로그램 만들기 – 1. 완성본 구경 : 네이버 블로그 [리눅스][소켓 통신] 채팅 프로그램 만들기 – 1. … #include
#include typedef struct recieve_data{ char* message; … - Table of Contents:
카테고리 이동
쟈스맨의 궤도
이 블로그
Linux
카테고리 글
카테고리
이 블로그
Linux
카테고리 글
취준생 일지 :: [Socket 프로그래밍] 1. 네트워크 프로그래밍과 소켓의 이해
- Article author: andjjip.tistory.com
- Reviews from users: 39051 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about 취준생 일지 :: [Socket 프로그래밍] 1. 네트워크 프로그래밍과 소켓의 이해 앞에서 봤던 함수의 호출과정을 확인하기 위해 연결 수락 시 “Hello World!” 라고 응답해주 서버 프로그램을 리눅스에서 작성해보자. 이 예제는 이해하지 … …
- Most searched keywords: Whether you are looking for 취준생 일지 :: [Socket 프로그래밍] 1. 네트워크 프로그래밍과 소켓의 이해 앞에서 봤던 함수의 호출과정을 확인하기 위해 연결 수락 시 “Hello World!” 라고 응답해주 서버 프로그램을 리눅스에서 작성해보자. 이 예제는 이해하지 … 소켓(Socket)? 네트워크로 연결되어있는 두 컴퓨터가 데이터를 주고 받을 수 있게 하는 것이 네트워크 프로그래밍이다. 그렇다면 네트워크로 연결되어있는 두 컴퓨터가 데이터를 주고받기 위해서는 물리적인 연결..
- Table of Contents:
사이드바
검색
티스토리툴바
Linux로 시작해보는 간단한 소켓 프로그래밍
- Article author: blog.neonkid.xyz
- Reviews from users: 29697 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about Linux로 시작해보는 간단한 소켓 프로그래밍 BSD Unix Socket 구성. 유닉스에서 소켓 프로그래밍을 할 때는 파일로 하여금 통신을 합니다. 그 이유는 유닉스의 리소스 구성은 파일로 이루어져 … …
- Most searched keywords: Whether you are looking for Linux로 시작해보는 간단한 소켓 프로그래밍 BSD Unix Socket 구성. 유닉스에서 소켓 프로그래밍을 할 때는 파일로 하여금 통신을 합니다. 그 이유는 유닉스의 리소스 구성은 파일로 이루어져 … 아직 소켓에 대한 개념을 모르시겠다구요? 아래의 버튼을 클릭하여 Socket 포스트를 미리 읽어보시기 바랍니다. 네트워크 프로그래밍의 기초 – Socket BSD Unix Socket 구성 유닉스에서 소켓 프로그래밍을 할 때..N.K LAB
- Table of Contents:
CCL
Open Source
Discuss
Linux로 시작해보는 간단한 소켓 프로그래밍
Tistory Comments 0
티스토리툴바
(리눅스 시스템 프로그래밍) OS Socket Programming + C예제코드
- Article author: zoomkoding.github.io
- Reviews from users: 4830 Ratings
- Top rated: 4.1
- Lowest rated: 1
- Summary of article content: Articles about (리눅스 시스템 프로그래밍) OS Socket Programming + C예제코드 (리눅스 시스템 프로그래밍) OS Socket Programming + C예제코드. by 줌코딩. April 7, 2019. in Os, Linux … …
- Most searched keywords: Whether you are looking for (리눅스 시스템 프로그래밍) OS Socket Programming + C예제코드 (리눅스 시스템 프로그래밍) OS Socket Programming + C예제코드. by 줌코딩. April 7, 2019. in Os, Linux … Socket Programming이란?
- Table of Contents:
Socket Programming이란
Stages for Server
Stages for Client
예제 코드
느낀점
See more articles in the same category here: 180+ tips for you.
[Network][TCP/IP] 소켓 구현(1)_ 리눅스 서버 구현
인자1. int domain
프로토콜 체계
우리는 주로 IPv4를 사용한다.
IPv6은 IP주소가 모두 고갈될 것을 염려하여 만들어진 16byte 주소 표준이다.
(+ 주소 표준이란?)
주로 사용하는 IPv4 (4byte)기준으로 ABCD 4개의 주소 클래스가 있는데,
차례대로 네트워크 ID의 Byte크기가 1,2,3,4이고
호스트 ID의 Byte크기가 3,2,1,0 이다.
이 주소 클래스에 따라 127.x.x.x 인지, 192.x.x.x인지 첫 번째 바이트 범위가 나누어진다.
A : 0~127
B: 128~191
C : 192~223
에 포함된 프로토콜 체계 우리는 주로 IPv4를 사용한다.
IPv6은 IP주소가 모두 고갈될 것을 염려하여 만들어진 16byte 주소 표준이다.
(+ 주소 표준이란?)
주로 사용하는 IPv4 (4byte)기준으로 ABCD 4개의 주소 클래스가 있는데,
차례대로 네트워크 ID의 Byte크기가 1,2,3,4이고
호스트 ID의 Byte크기가 3,2,1,0 이다.
이 주소 클래스에 따라 127.x.x.x 인지, 192.x.x.x인지 첫 번째 바이트 범위가 나누어진다.
A : 0~127
B: 128~191
C : 192~223
인자2. int type
전송방식
위 II – 3에서 설명한 TCP/UDP 계층을 선택한다.
TCP : SOCK_STREAM
UDP : SOCK_DGRAM
인자3. int protocol
프로토콜 정보
하나의 프로토콜 체계 안에 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재할 때 필요한 인자이다.
말이 길고 어려운데, 우리가 원하는 TCP, UDP를 사용할 때는 0을 넣어도 무관하다. (만족하는 것이 딱 1개 이므로)
REAKWON :: [리눅스] 소켓(socket) 개념과 예제(connect, bind, listen, accept,send,recv 사용)
소켓(socket)
네트워크 통신을 하는 표준 방법으로 프로세스간 연결의 종점이라고 볼 수 있습니다. 기본적인 개념은 아래의 그림과 같습니다.
위의 그림은 TCP/IP에서의 인터넷 통신을 보여줍니다. 클라이언트의 컴퓨터의 물리적 주소(MAC 주소) DD-44-EE-55-FF-66이며 논리적 주소(IP 주소)는 10.2.2.2입니다. 클라이언트는 여러가지의 프로그램을 실행시키고 있는데 그 중 어떤 프로세스는 TCP 포트번호 12345를 사용합니다. 이 클라이언트 프로세스는 물리적 주소가 11-AA-22-BB-33-CC이며 논리적 주소 10.1.1.3인 서버 컴퓨터의 포트 번호 80번을 사용하는 서버 프로세스와 연결되어 있습니다.
구체적으로 어떻게 통신할까요? 각 프로세스는 소켓을 통해서 통신을 하게 되는데, 소켓은 간단히 얘기해 ip주소와 포트번호를 갖고 있는 인터페이스라고 생각하면 됩니다. 소켓은 리눅스에서 파일로 다루어지며 프로세스는 이 소켓을 사용할때 파일디스크립터를 통해 사용합니다. 우리는 리눅스 파일 입출력에 대해 배울때 파일디스크립터를 사용했지요? 소켓 역시 파일디스크립터를 이용해서 읽기, 쓰기가 가능합니다.
소켓 통신할때 필요한 주요함수는 무엇이 있을까요? 간단히 알아보도록 합시다.
1. socket(int domain, int type, int protocol)
소켓을 만드는데 바로 이 함수를 사용합니다. 소켓 역시 파일로 다루어지기 때문에 반환값은 파일디스크립터입니다. 만약 소켓을 여는데 실패했다면 -1을 리턴합니다.
2. connect(int fd, struct sockaddr *remote_host, socklen_t addr_length)
원격 호스트(원격 컴퓨터)와 연결하는 함수입니다. 연결된 정보는 remote_host에 저장됩니다. 성공시 0, 오류시 -1을 반환합니다.
3. bind(int fd, struct sockaddr *local_addr, socklen_t addr_length)
소켓을 바인딩합니다. 이렇게 생각하면 됩니다. 지금 fd로 넘겨지는 소켓과 이 프로세스와 묶는다(bind)라고 생각하시면 됩니다. 그래서 해당 프로세스는 소켓을 통해 다른 컴퓨터로부터 연결을 받아들일 수 있습니다.
4. listen(int fd, int backlog_queue_size)
소켓을 통해 들어오는 연결을 듣습니다. backlog_queue_size만큼 연결 요청을 큐에 넣습니다. 성공시 0, 오류시 -1을 반환합니다.
5. accept(int fd, sockaddr *remote_host, socklen_t *addr_length)
어떤 컴퓨터에서 이 컴퓨터로 연결할때 연결을 받아들입니다. 함수 이름이 말해주고 있죠.
연결된 원격 컴퓨터의 정보는 remote_host에 저장됩니다. 오류시에 -1을 반환합니다.
6. send(int fd, void* buffer, size_t n, int flags)
buffer를 소켓 파일 디스크립터인 fd로 전송합니다. 보낸 바이트수를 반환하며 실패시 -1을 반환합니다.
7. recv(int fd, void* buffer, size_t n, int flags)
send함수와 사용법이 거의 비슷합니다. n바이트를 buffer로 읽습니다. 성공시 받은 바이트수를 반환하며 실패시 -1을 반환합니다.
이제 예제를 보며 더 자세한 설명을 하도록 하죠. 다음 예제는 서버 프로그램이 클라이언트 프로그램에서 전송한 메시지를 출력해주는 소스코드입니다. 클라이언트 프로그램은 텔넷을 사용할 것이기 때문에 따로 클라이언트 프로그램 소스코드는 없습니다.
#include
#include #include #include #include #include #define PORT 12346 #define BUF_SIZE 1024 int main(void){ int socket_fd,accepted_fd; struct sockaddr_in host_addr, client_addr; socklen_t size; int recv_length; char buffer[BUF_SIZE]; socket_fd=socket(PF_INET,SOCK_STREAM,0); host_addr.sin_family=AF_INET; host_addr.sin_port=htons(PORT); host_addr.sin_addr.s_addr=0; memset(&(host_addr.sin_zero),0,8); bind(socket_fd,(struct sockaddr *)&host_addr,sizeof(struct sockaddr)); listen(socket_fd,3); while(1){ size=sizeof(struct sockaddr_in); accepted_fd=accept(socket_fd,(struct sockaddr *)&client_addr,&size); send(accepted_fd,”Connected”,10,0); printf(“Client Info : IP %s, Port %d “, inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); recv_length=recv(accepted_fd,&buffer,BUF_SIZE,0); while(recv_length>0){ printf(“From Client : %s
“,buffer); recv_length=recv(accepted_fd,&buffer,BUF_SIZE,0); } close(accepted_fd); } return 0; }
여기서 포트번호는 12346을 사용한다고 하겠습니다.
socket_fd=socket(PF_INET,SOCK_STREAM,0);
socket의 첫번째 인자는 프로토콜 체계 PF(Protocol Family)를 지정합니다. PF_INET은 인터넷 IP프로토콜 체계입니다. 사용하는 프로토콜 체계에는 여러가지가 있습니다. IP외에도 1970년대에 개발된 공중 데이터 네트워크에 대한 표준 X.25 외에도 애플토크,XEROX 네트워크 등등 있는데 우리는 IP를 사용할 것이기 때문에 PF_INET만 사용할 것입니다.
두번째 인자는 소켓의 타입입니다. 가장 보편적으로 사용하는 타입은 Stream과 Datagram입니다. SOCK_STREAM은 연결형, SOCK_DGRAM은 비연결형이라고 생각하면 되겠습니다.
세번째 인자는 프로토콜로, 일반적으로 0을 넣어주면 시스템이 자동으로 설정해줍니다.
host_addr.sin_family=AF_INET; host_addr.sin_port=htons(PORT); host_addr.sin_addr.s_addr=0; memset(&(host_addr.sin_zero),0,8); bind(socket_fd,(struct sockaddr *)&host_addr,sizeof(struct sockaddr));
다음은 바인드할때 구조체를 넘겨야하는데요. 이 프로세스가 사용할 소켓 fd와 컴퓨터의 IP주소, 포트와 묶는 작업이라고 보면 됩니다.
우리는 TCP/IP 상에서의 통신이기 때문에 IPv4용 구조체인 sockaddr_in을 사용합니다.
sin_family에는 IP용 Address Family(AF_INET)을 지정합니다.
sin_port는 이 프로세스가 사용할 포트번호를 지정합니다.
sin_addr.s_addr에는 주소가 들어가게 되는데요. 0은 현재 컴퓨터의 주소를 자동으로 채우라는 의미입니다. 그것이 아니라면 주소를 직접 지정해주어야합니다.
htons?
sin_port에서 htons는 무슨 함수일까요? 이 함수의 풀 네임은 host-to-network short로 16비트 정수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환하는 함수입니다.
AF_INET 소켓 주소 구조체에서 사용되는 포트 번호와 IP주소는 빅 엔디언(Big-Endian)이라는 네트워크 바이트 순서를 따릅니다. 이것은 보통 우리가 사용하는 x86의 리틀 엔디언과는 반대의 표기법이죠. 그래서 변환없이 그대로 사용하게 되면 바이트 순서가 달라지게 되어 제대로 동작하지 않습니다.
이제 bind를 호출하는데 두번째 인자를 보세요. (struct sockaddr*)로 형 변환하고 있습니다. host_addr이라는 구조체 변수는 sockaddr_in이라는 구조체입니다.
bind는 TCP/IP뿐만 아니라 X.25, 애플토크 등 여러 프로토콜이 존재하기 때문에 인자로 받아야할 구조체 형이 sockaddr_in뿐만이 아닙니다. 그래서 일반화된 구조체가 필요하게 되는데 그 구조체가 sockaddr입니다.
sockaddr_in은 sockaddr로 형변환할 수 있습니다. 왜냐하면 구조체의 크기가 같기 때문이죠. sockaddr 구조체는 2바이트의 Address Family와 14바이트의 주소를 사용합니다. 반면 sockaddr_in의 IPv4 전용 구조체는 sa_data의 주소를 포트번호, ip주소, 기타 추가 비트를 포함하고 있죠. 우리는 일반화된 sockaddr에 sa_data에 직접 포트번호와 주소를 읽고 쓰기가 상당히 불편합니다.
그래서 더 사용하기 편한 인터넷 전용 구조체를 사용합니다. 형변환에 문제가 없게 크기를 같게 만들어 호환성에 문제가 없습니다.
listen(socket_fd,3);
그 소켓으로 들어오는 연결을 기다립니다. 마지막인자는 백로그 큐의 최대크기입니다.
while(1){ size=sizeof(struct sockaddr_in); accepted_fd=accept(socket_fd,(struct sockaddr *)&client_addr,&size); send(accepted_fd,”Connected”,10,0); printf(“Client Info : IP %s, Port %d
“, inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); recv_length=recv(accepted_fd,&buffer,BUF_SIZE,0); while(recv_length>0){ printf(“From Client : %s
“,buffer); recv_length=recv(accepted_fd,&buffer,BUF_SIZE,0); } close(accepted_fd); }
accept를 통해서 이제 새롭게 연결된 클라이언트 전용 파일디스크립터를 얻어옵니다. 클라이언트에 대한 정보는 client_addr에 저장됩니다.
연결이 성공돼었다면 send를 통해서 “Connected”라는 문자열을 클라이언트 쪽으로 보냅니다.
그 후 클라이언트의 정보를 출력하지요. 두가지를 출력합니다. IP주소와 Port번호입니다.
inet_ntoa(struct in_addr *network_addr)
네트워크 주소를 숫자사이의 점을 찍는 IP주소로 network to acsii라는 뜻입니다. ip주소가 담긴 in_addr구조체는 32비트의 네트워크 주소를 갖고 있기 때문에 숫자사이에 점을 찍는 형태로 바꾸려면 이 함수를 사용합니다.
ntohs(Network-to-Host Short)
이것 역시 네트워크 바이트 순서가 빅 엔디안이고, 호스트의 바이트 순서가 리틀 엔디안일때 변환해야할때 사용합니다.
그 후에는 계속 recv를 통해 클라이언트에서 입력받은 메시지를 서버에서 그대로 출력해줍니다.
결과
서버
[[email protected] network]# gcc server.c [[email protected] network]# ./a.out클라이언트
[[email protected] ~]# telnet 192.168.10.131 12348Trying 192.168.10.131…
Connected to 192.168.10.131.
Escape character is ‘^]’.
Connected
서버
Client Info : IP 192.168.10.131, Port 43774
클라이언트
Hi
I’m Reakwon
서버
From Client :
From Client : Hi
From Client : I’m Reakwon
클라이언트에서 타이핑한 것이 서버에서 그대로 출력이 되는 것을 볼 수 있습니다.
이상으로 간단히 리눅스의 소켓과 그에 대한 예제를 보았습니다.
[소켓 프로그래밍 C언어] 기본적인 서버 프로그램 만들기 (리눅스, 유닉스 편) server 관련 함수 및 소스코드
반응형
안녕하세요~!
오늘은 기본적인 TCP 서버 프로그램을 작성해볼게요.
소켓 프로그래밍으로 간단한 채팅 서버를 만들어볼 생각인데, 찬찬히 진행해보도록 합시다.
소켓 프로그래밍이란?
오늘날 모든 컴퓨터는 소통을 하죠!
보통 내가 먼저 다른 노드(컴퓨터)에 요청을 하면 나는 고객(?)이니까 클라이언트가 됩니다.
그리고 반면에 다른 컴퓨터가 똑똑 두드리면, 신호를 받아서 데이터를 내려주는 역할을 서버라고 간략하게 정의해볼 수 있어요. 네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있도록 하는 것이 네트워크 프로그래밍, 즉 소켓 프로그래밍입니다.
소켓 socket?
소프트웨어적인 데이터 송수신 방법을 이미 운영체제에서 제공해주고 있는데 이게 ‘소켓(Socket)’입니다. 모든 운영체제에서 지원해줘요.
이는 물리적으로 연결된 네트워크상에서의 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치를 의미합니다.
그냥 데이터를 주고 받기 위해서는 소켓 디스크립터라는 파일시스템을 이용해야하는데, 그게 소켓이라 생각하면 돼요!
그리고 이미 운영체제에서 제공해주고 있는 함수로 우리는 원하는 통신 프로그램을 소스로 짜서 실현시킬 수 있다는거~
서버를 만들기 위한 절차
1. socket() 소켓 생성
일단 다른 노드(컴퓨터)들과 통신하려면, 통신 개찰구가 필요하잖아요. 소켓을 생성해줍니다.
2. bind()
그 다음 bind라는 걸 해야하는데요.
내가 만드려는 서버의 ip주소와 포트를 소켓에 할당하는 역할을 수행해요.
3. listen()
그럼 이제 다른 컴퓨터에서 노크를 두드려도 응답해줄 수 있도록 대기상태로 만들기
4. accept()
만약 어떤 클라이언트로부터 연결 요청이 왔으면 수락해주는 함수
5. read() write()
이제 두 컴퓨터가 연결이 되었으니 필요한 데이터를 전송하고 받고~
6. close()
끝났으면 연결을 끊어줍시다.
서버 만드는데 필요한 함수
이제 해당 순서에 필요한 함수들을 살펴봅시다.
1. socket() 소켓 생성
소켓 생성하는 함수입니다.
#include
int socket(int domain, int type, int protocol); 인자값:
int domain:
어떤 영역에서 통신할 것인지에 대한 영역을 지정합니다 (protocol family지원)
올 수 있는 값 : AF_UNIX, AF_INET, AF_INET6 등
AF_UNIX는 프로세스끼리 통신할 때,
AF_INET은 IPv4, AF_INET6는 IPv6를 의미합니다.
우린 IPv4를 사용하니까 포스팅에선 AF_INET을 사용해줄거예요.
int type:
어떤 서비스 타입의 소켓을 생성할건지 적는건데요, 값 내용은 아래와 같습니다.
SOCK_STREAM(TCP), SOCK_DGRAM(UDP), SOCK_RAW(Raw 방식 TCP나 UDP를 거치지 않고 바로 IP계층 사용시)
우리는 TCP연결 지향형 통신을 생성하고자 하니 SOCK_STREAM을 적어주겠네요.
int protocol:
소켓에서 사용할 프로토콜.
IPPROTO_TCP: TCP방식
IPPROTO_UDP: UDP방식
0: type에서 미리 정해진 경우.
리턴값:
소켓을 가리키는 소켓 디스크립터를 반환합니다.
-1 소켓 생성 실패
0 이상의 값 : 소켓 디스크립터
코드 예시:
//TCP연결지향형이고 ipv4 도메인을 위한 소켓을 생성 serv_sock=socket(PF_INET, SOCK_STREAM, 0); if(serv_sock == -1) printf(“socket error
“);
2. bind()
#include
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); 그 다음 소켓이랑 서버의 정보를 묶어주는 함수입니다.
이걸 왜하냐, 다른 외부의 컴퓨터가 서버에 연결하려고 요청을 했어요, 물론 IP주소를 기반으로 찾았겠죠. 근데 통신을 위해선 소켓디스크립터 번호를 알아야하는데 IP주소를 안다고 얘를 알 수 있는게 아니잖아요. 그래서 두개를 묶어주는 작업을 하는겁니다.
인자값:
int sockfd:
fd가 파일디스크립터의 약자예요. 즉 1번 함수 리턴값으로 받은 소켓 디스크립터를 여기 넣어주면 됩니다.
struct sockaddr *myaddr:
서버의 IP주소를 넣어줘요.
scoklen_t addrlen:
주소 길이를 넣어줍니다.
리턴값:
성공시 0, 실패시 -1.
코드 예시:
//소켓과 서버 주소를 바인딩 if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1) printf(“bind error”);
3. listen()
이제 어떤 컴퓨터로부터 요청이 와도 수락할 수 있게 대기상태에 들어가는 함수입니다.
#include
int listen(int sockfd, int backlog); 인자값:
int sockfd:
2번 bind함수의 첫 인자와 같습니다. 소켓 디스크립터를 여기 넣어줍시다.
int backlog:
연결 대기열의 크기를 지정합니다. listen이라는 게 결국 연결요청 소켓이 대기하는 연결 대기열을 생성하는 거거든요.
네트워크 상태와 서비스 종류에 따라서 달라집니다.
리턴값:
성공시 0, 실패시 -1.
4. accept()
#include
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 서버 소켓에다가 이제 클라이언트를 연결하는 함수입니다.
그래서 두 번째와 세 번째 주소 관련 인자에는 클라이언트 정보가 들어가게 돼요.
인자값:
int sockfd:
2번 bind함수의 첫 인자와 같습니다. 서버 소켓 디스크립터를 여기 넣어줍시다.
struct sockaddr *addr:
클라이언트 주소 정보를 담고 있는 구조체
socklen_t *addrlen:
2번째 인자 값의 길이
C언어 서버 프로그램
전체 흐름과 필요한 함수들을 모두 살펴봤으니 아주아주 기본적인 서버 프로그램을 작성해봅시다.
가장 베이직한 거니까, 서버 IP는 임의적으로 사용 가능한걸 할당하게 하고, port만 실행시 인자로 받을 거예요.
이런식으로 명령어를 치게 되면 3550포트에 서버 프로세스를 켜놓는거죠.
$server 3550
#include
#include //atoi를 사용하려면 있어야함 #include // memset 등 #include //sockaddr_in, read, write 등 #include //htnol, htons, INADDR_ANY, sockaddr_in 등 #include void error_handling(char * message); int main(int argc, char* argv[]) { int serv_sock; int clnt_sock; //sockaddr_in은 소켓 주소의 틀을 형셩해주는 구조체로 AF_INET일 경우 사용 struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; //accept함수에서 사용됨. socklen_t clnt_addr_size; //TCP연결지향형이고 ipv4 도메인을 위한 소켓을 생성 serv_sock=socket(PF_INET, SOCK_STREAM, 0); if(serv_sock == -1) error_handling(“socket error”); //주소를 초기화한 후 IP주소와 포트 지정 memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family=AF_INET; //타입: ipv4 serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); //ip주소 serv_addr.sin_port=htons(atoi(argv[1])); //port //소켓과 서버 주소를 바인딩 if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1) error_handling(“bind error”); //연결 대기열 5개 생성 if(listen(serv_sock, 5)==-1) error_handling(“listen error”); //클라이언트로부터 요청이 오면 연결 수락 clnt_addr_size = sizeof(clnt_addr); clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); if(clnt_sock==-1) error_handling(“accept error”); /*—–데이터 전송—–*/ char msg[] = “Hello this is server! “; write(clnt_sock, msg, sizeof(msg)); //소켓들 닫기 close(clnt_sock); close(serv_sock); return 0; } void error_handling(char *message) { fputs(message,stderr); fputc(‘
‘, stderr); exit(1); }
위 IP주소 설정해주는 부분에서
INADDR_ANY라는게 있는데 ‘컴퓨터에 존재하는 랜카드 중 사용 가능한 랜카드의 IP주소를 사용하라’라는 의미입니다.
위 소스같은 경우에는 일단 하나의 클라이언트와 연결이 되면, Hello this is server라는 메세지를 클라이언트에 내려주고 통신을 종료해버려요. 정말 기본요소들만 갖고 있는셈이죠.
▼혹시! 해당 소스코드 중 sockaddr 등, 주소체계를 저장하는 구조체에 대한 내용이 궁금하신 분은 아래 포스팅을 참조해주세요!
컴파일
gcc server.c -o server //gcc컴파일러일 경우 cc server.c -o server //gcc가 아닐 경우 기본
다 작성 하였으면 위 명령어로 컴파일을 해줍시다. server.c를 컴파일해서 server라는 실행파일을 만들라는 명령어예요.
gcc가 없을 경우 설치
컴파일러가 없을 경우에는 sudo apt install gcc 명령어를 통해 설치해주면 됩니다.
컴파일 후
그리고 컴파일 하면 .c 소스파일 외에 server 실행파일이 생깁니다.
서버 실행후 클라이언트 접속해보기
서버를 실행한 후에 telnet으로 접속 시도로 결과를 확인해볼게요.
저의 경우 리눅스 가상머신에다가 server를 포트 3550에 실행시켜줬습니다. 3550포트는 임의의 포트입니다. telnet으로 서버에 연결할 때 동일한 포트를 써주면 돼요.
서버 실행화면
그 다음 컴퓨터의 cmd창이나 파워셸에다가 telnet 연결을 시도했어요.
즉 리눅스 가상머신은 서버가! 내가 실행하고 있는 윈도우 데스크탑은 클라이언트가되는거죠!
서버 접속 시도
참고로 서버의 ip주소는 ifconfig라는 명령어로 확인해볼 수 있습니다.
hostname
또는 I옵션과 함께 hostname 명령어로 IP주소를 확인할 수 있어요.
실행 결과,
‘Hello this is server!’라는 응답을 정상적으로 수신한 후 통신이 종료되는 것을 확인할 수 있어요.
오늘은 간단한 서버 프로그램을 짜봤어요. ㅎㅎ 다음 포스팅에는 기본적인 클라이언트 프로그램을 작성해보도록 할게요 ㅎㅎ 지금은 클라이언트 프로그램이 없어서 telnet을 이용해 테스트 해봤지만, 다음 시간엔 가상머신 두 대를 켜놓고 서버와 클라이언트 간의 통신을 확인해보도록 합시다.
▼다음 포스팅 바로가기!
도움이 되셨다면 좋아요, 댓글, 광고보답은 어떤가요?! 정보 공유에 큰 활력이 됩니다. 감사합니다.
반응형
So you have finished reading the 리눅스 소켓 프로그래밍 topic article, if you find this article useful, please share it. Thank you very much. See more: C 소켓 프로그래밍, 소켓 프로그래밍 로그인, 소켓프로그래밍 책, 소켓 서버, 소켓 프로그래밍 파이썬, 소켓 프로그래밍 C, 자바 소켓 프로그래밍, 서버/클라이언트 프로그래밍