검색결과 리스트
프로그래밍/Network Programming 에 해당되는 글 8건
- 2021.01.07 소켓의 개념
- 2020.11.19 서버 프로그램 흐름 만들기
- 2020.11.19 3. 데이터 통신하기
- 2020.11.19 소켓에 연결하기
- 2020.11.19 네트워크 프로그램의 흐름
- 2015.07.06 시리얼 통신 개요(Serial Communication)
- 2015.06.29 시리얼 통신 동기 방식 구현
- 2015.06.25 Windows 시리얼 통신
응용 프로그램 관점에서 소켓은 운영체제의 TCP/IP 구현에서 제공하는 데이터 구조체를 참조하기 위한 매개체
TCP/IP를 이용하여 응용 프로그램이 통신을 수행하기 위해서는 다음 요소
프로토콜 - 소켓을 생성할 때 결정
지역 IP 주소와 지역 포트 번호 - 자신의 주소
원격 IP 주소와 원격 포트 번호 - 상대의 주소
bind 함수
소켓을 인터넷 주소에 묶어주기 위해서 사용
서버 프로그램은 어떤 포트에서 기다릴지 명시해야 함
그래야 클라이언트 프로그램은 그 포트로 찾아갈 수 있음
int bind(int sockfd, struct sockaddr* my_addr, socklen_t addrlen);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY); // 어떠한 IP 든지 기다림
addr.sin_port = htons(8080);
state = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
listen 함수
- 수신 대기열을 만든다
int listen(int queue_size);
accept 함수
- 수신 대기열에서 연결을 가져온다
int accept(int s,
이 함수를 성공하면 새로운 소켓을 만드는데 이 소켓은 클라이언트와 직접 연결된 소켓
이 소켓을 연결 소켓이라 부름
accept에서 매개변수에 사용되는 소켓은 요청을 듣기 위해 사용되는 소켓
듣기 소켓이라 부름
듣기 소켓과 연결 소켓을 구분하는 이유는 한 번에 여러 개의 소켓을 다루기 위함
동시에 2 개 이상의 소켓을 다루는 부분은 이후에 다룸
데이터 입출력
* 소켓 함수 : send, recv, sendto, recvfrom
* 파일 함수 : read, write
입력함수
- send, sendto, read
출력함수
- recv, recvfrom, write
4. 연결 종료
close(int sockfd);
closesocket(SOCKET sockfd);
클라이언트
socket() - connect() - read()/write() - close()
서버
sockete() - bind() - listen() - accept() - read()/write() - close()
인터넷 주소와 포트번호를 이용해서 원격 소켓에 연결
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr* serv_addr, socklen_t addrlen);
sockfd - 소켓을 만든 소켓 지정 번호
serv_addr - IP와 port 번호 지정
원격 소켓의 인터넷 주소 지정하기
struct sockaddr_in server_address;
server_sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("211.3.45.33");
server_address.sin_port = htons(8080);
client_len = sizeof(server_address);
connect(server_sockfd, (struct sockaddr*)&server_address, client_len);
흐름을 만들어보기
1. 송신측
소켓 생성 -> 포트 부여 -> 상대편 IP/Port 주소로 연결 -> 통신 -> 종료
2. 수신측
소켓 생성 -> 포트 부여 -> 상대편 연결 기다리기 -> 통신 -> 종료
1. 소켓 생성
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- domain : 소켓의 사용 영역을 정의
- type : 소켓 유형을 정의
- protocol : 소켓이 사용할 프로토콜을 정의
* domain : 소켓의 사용영역 정의
인터넷 : AF_INET
컴퓨터 : AF_UNIX
* type과 protocol
TCP : SOCKET_STREAM - IPPROTO_TCP
UDP : SOCKET_DGRAM - IPPROTO_UDP
소켓 함수 사용 예
1. TCP
socket(AF_INET, SOCKET_STREAM, IPPROTO_TCP)
2. UDP
socket(AF_INET, SOCKET_DGRAM, IPPROTO_UDP)
성공하면 0보다 큰 수를 반환
이 때 반환 값은 소켓을 가리키는 값
- 시리얼 통신
- 신호(데이터)를 1비트마다 직렬(Serial)로 보내는 통신
- 시간의 흐름에 따라 차례로 보내는 통신 인터페이스
- 종류 : RS232, RS422, RS485
- 동기(Synchronous), 비동기(Asynchronous) 방식
- 1바이트를 8개의 비트로 분리해서 한 번에 1비트씩 통신 선로로 전송
- 수신 측이 1바이트를 식별하기 위해 사용하는 것이 스타트 비트 & 스톱 비트
- 데이터 비트는 5, 6, 7, 8 중 하나 설정
- 데이터 비트(ByteSize)값 고 보오 레이트(Baud rate)를 일치하도록 설정
- BPS : 1초에 몇 비트가 전송되는가? (bps : bit per second)
- Baud rate : 1초에 신호가 몇 개 전송되는가?
cf) 1초에 신호가 하나일 수도 있지만, 두개, 세개, 네개 일 수도 있음
- 패리티(Parity) : 2진수의 값 중에서 1이 몇 개인가 검사.
cf) 짝수 패리티, 홀수 패리티 - 패리티가 맞지 않다면 데이터 변질이 되었다고 생각
- 정지 비트(Stop Bit) : 지정된 시간만큼 1을 가짐
- 프레임의 길이는 사전에 송신측과 수신측이 협의하여 맞추어야 함
=> 패리티가 다르거나 비트의 수가 맞지 않으면 통신을 할 수 없다
* 포트 열기 - 포트 설정 - 데이터 읽기 - 데이터 쓰기
1. 포트 열기
portname = "COM3";
2. 포트와 버퍼 설정
SetupComm - 버퍼 사이즈 설정
PurgeComm - 해당 버퍼 청소
Windows에서는 시리얼 통신에 관한 함수가 따로 존재하지 않고
파일에 읽고 쓰는 것으로 통신한다
시리얼 통신에 관한 기초 자료는 다음 자료에 잘 나와있다
CreateFile( ) 함수를 이용하여 포트를 생성하고 ReadFile( ), WriteFile( )을 이용하여
데이터를 주고 받는다.
CreateFile( ) : 파일이나 입출력 장치를 연다.
입출력 장치 : 파일, 파일스트림, 디렉토리, 디스크, 볼륨, 콘솔버퍼, 파이프
각 장치를 제어할 수 있는 핸들 반환
CreateFile( ) 에 관한 사이트 주소 :
http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/4200/CreateFile
여기서 포트 입출력(시리얼 통신) 프로그램을 만들어보자