라즈베리파이로 TCP/IP 소켓 통신
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=5928062&start=pgooglemc
윤성우의 열혈 TCP/IP 소켓 프로그래밍
눅스와 윈도우 기반에서의 소켓 프로그래밍을 함께 설명하며, 초보자에게 적절한 설명과 예제를 통해서 소켓 프로그래밍에 대한 재미를 안겨주고자 한 책이다. 2003년도에 출간된 <열혈강의 TCP/I
www.aladin.co.kr
tcp/ip 소켓 프로그래밍 교재. 위 책을 보고 초간단 요약 하였습니다. 자세한 부분은 교재를 참고하세요!
01. 네트워크 프로그래밍과 소켓의 이해(요약)
네트워크 프로그래밍(= 소켓 프로그래밍)이란? 네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고 받을 수 있도록 한 것.
물리적으로 연결된 네트워크 상에서 데이터 송수신에서 사용할 수 있는 소프트웨어적인 장치 - 소켓 -을 통해 네트워크 망을 연결할 수 있다.
서버: 연결 요청을 수락하는 프로그램으로, 필요한 함수들은 다음과 같다.
#include <sys/socket.h>
int socket(int domain, int type, int protocol); // 1. 소켓 생성
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); // 2. 소켓에 ip주소, port번호 할당
int listen(int sockfd, int backlog); // 3. 소켓을 연결 요청이 가능한 상태로 변경
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); // 4. 연결 요청에 대한 수락
클라이언트: 소켓 생성, 서버로의 연결 요청을 하는 프로그램이다.
#include <sys/socket.h>
int socket(int domain, int type, int protocol); // 1. 소켓 생성
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen); // 2. 서버로의 연결 요청
bind, listen 함수의 호출이 이어지면 서버 소켓, connect 함수의 호출이 이어지면 클라이언트 소켓이다.
Makefile
다음과 같은 makefile을 사용하여 코드를 컴파일하였다.
#CC:=arm-linux-gcc
CC:=gcc
TARGET_SRV=iot_server
OBJECT_SRV=$(TARGET_SRV).o
TARGET_CLN=iot_client
OBJECT_CLN=$(TARGET_CLN).o
#LDFLAGS=-D_REENTRANT -pthread -lmysqlclient
LDFLAGS=-D_REENTRANT -pthread
all : $(TARGET_SRV) $(TARGET_CLN)
$(TARGET_SRV):$(OBJECT_SRV)
$(CC) -o $@ $(OBJECT_SRV) $(LDFLAGS)
$(TARGET_CLN):$(OBJECT_CLN)
$(CC) -o $@ $(OBJECT_CLN) $(LDFLAGS)
%.o:%.c
$(CC) -c -o $@ $<
clean:
rm -f *.o $(TARGET_SRV) $(TARGET_CLN)
iot_server.c와 iot_client.c를 make 해준 후,
*make all 하면 모든 파일을 make하고, make clean 하면 make로 생긴 파일을 모두 지운다.
파일을 하나씩 make 하려면
gcc iot_server.c(make 대상이 되는 파일 이름) -o iot_server(output의 이름) 이런 식으로 명령어를 실행하면 된다.
./iot_server 5000(포트 번호)
./iot_client 127.0.0.1(루프백 주소) 5000(포트 번호) 20(클라이언트 이름) 명령어를 실행해 서버와 클라이언트 프로그램을 실행하였다.
*루프백 주소: 컴퓨터 자신의 IP 주소를 의미한다. 하나의 컴퓨터에서 서버와 클라이언트가 모두 실행될 수 있게 한다.
*INADDR_ANY: 이 상수로 서버의 IP 주소를 할당할 경우, IP주소가 자동으로 할당되며 포트번호만 맞으면 수신할 수 있기 때문에 서버 프로그램 구현에 많이 쓰인다.
이 하나의 서버를 통해 여러 클라이언트들이 메시지를 주고받을 수 있다.
블루투스 모듈도 클라이언트로 연결해주었다.
[LSB_BT]MOTOR@RIGHT 처럼 앞에 전송하는 대상을 쓰면 그 클라이언트에게만 메시지가 전송되고, 전송 대상을 표기하지 않으면 전체 메시지로 전송되는 것을 확인할 수 있다.
stm32f429 보드와 와이파이 모듈을 연결해서 tcp 통신을 통해 접속해보았다.
led가 on off 되는 것을 확인할 수 있다.