2021. 1. 7. 00:15

응용 프로그램 관점에서 소켓은 운영체제의 TCP/IP 구현에서 제공하는 데이터 구조체를 참조하기 위한 매개체


TCP/IP를 이용하여 응용 프로그램이 통신을 수행하기 위해서는 다음 요소



프로토콜 - 소켓을 생성할 때 결정


지역 IP 주소와 지역 포트 번호 - 자신의 주소


원격 IP 주소와 원격 포트 번호 - 상대의 주소



2020. 11. 19. 12:29

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 개 이상의 소켓을 다루는 부분은 이후에 다룸




2020. 11. 19. 12:03

데이터 입출력


 * 소켓 함수 : 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()




2020. 11. 19. 11:57

인터넷 주소와 포트번호를 이용해서 원격 소켓에 연결


#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);



2020. 11. 19. 11:54

흐름을 만들어보기


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보다 큰 수를 반환


이 때 반환 값은 소켓을 가리키는 값







2015. 7. 6. 13:14

  • 시리얼 통신 

- 신호(데이터)를 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을 가짐

- 프레임의 길이는 사전에 송신측과 수신측이 협의하여 맞추어야 함

    => 패리티가 다르거나 비트의 수가 맞지 않으면 통신을 할 수 없다

2015. 6. 29. 19:24

* 포트 열기 - 포트 설정 - 데이터 읽기 - 데이터 쓰기


1. 포트 열기


portname = "COM3";



2. 포트와 버퍼 설정 

SetupComm - 버퍼 사이즈 설정

PurgeComm - 해당 버퍼 청소





2015. 6. 25. 11:15

Windows에서는 시리얼 통신에 관한 함수가 따로 존재하지 않고

파일에 읽고 쓰는 것으로 통신한다


시리얼 통신에 관한 기초 자료는 다음 자료에 잘 나와있다

시리얼_통신의_기초 (1).pdf


CreateFile( ) 함수를 이용하여 포트를 생성하고 ReadFile( ), WriteFile( )을 이용하여

데이터를 주고 받는다.


CreateFile( ) : 파일이나 입출력 장치를 연다.

입출력 장치 : 파일, 파일스트림, 디렉토리, 디스크, 볼륨, 콘솔버퍼, 파이프

각 장치를 제어할 수 있는 핸들 반환


CreateFile( ) 에 관한 사이트 주소 : 

http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/4200/CreateFile


여기서 포트 입출력(시리얼 통신) 프로그램을 만들어보자