임베디드

임베디드

  • 분류 전체보기 (1142)
    • PL (150)
      • C++ (108)
      • Python (39)
      • Java (3)
      • Kotlin (0)
    • 알고리즘 (462)
      • 암기 (91)
      • 백준 (328)
      • 삼성 (17)
      • 종만북 (4)
      • 프로그래머스 (22)
    • 임베디드 (411)
      • 하드웨어지식 (12)
      • ATmega128 (98)
      • 32F429IDISCOVERY (57)
      • 임베디드리눅스 (15)
      • 리눅스커널스터디16기 (2)
      • 리눅스시스템프로그래밍 (97)
      • 운영체제 (26)
      • 컴퓨터구조 (4)
      • dd (1)
      • ubuntu (81)
      • opencv (18)
    • 드론 (99)
    • TIP (12)
  • 홈
  • 태그
  • 방명록
RSS 피드
로그인
로그아웃 글쓰기 관리

임베디드

컨텐츠 검색

태그

#linuxbirthday_a_message_from_Seoul_Korea !!

최근글

댓글

공지사항

아카이브

드론(99)

  • socket 함수의 3번째 인자

    2019.07.23
  • send/recv partial Error 방지하는 법

    2019.07.23
  • tcp bind 에러 원인과 해결법과 SO_REUSEADDR

    2019.07.22
  • SOCK_DGRAM은 read/write 사용할 수 없는 이유

    2019.07.22
  • 동작 중인 포트 조회해서 지우기

    2019.07.22
  • TCP 네트워크 프로그래밍 - 1

    2019.07.22
socket 함수의 3번째 인자

IPv4 인터넷 계층에서 TCP 연결지향형 데이터 전송 소켓을 사용한다고 하면 socket(AF_INET, SOCK_STREAM, 0)이라고 일반적으로 적게 된다. 그런데 소켓의 3번째 인자인 protocol에 0을 적는 이유는 무엇인가? 3번째 인자의 이름이 protocol이라고 명명되어있는데, 실제 프로토콜은 앞의 인터넷 계층과 전송 계층을 정의하면서 이뤄지게 되므로 의미가 없어지게 된다. 3번째 인자가 필요하게 되는 경우는 "하나의 프로토콜 체계 안에서 데이터의 전송방식이 동일한 프로토콜이 둘 이상 존재하는 경우에는 3번째 인자를 통해 구체화하게 된다 위 경우에는 두 옵션을 만족시키는 프로토콜이 하나만 존재하기 때문에 0을 넣는 것이다. 다음은 socket manual에 있는 protocol에 대한..

2019. 7. 23. 10:03
send/recv partial Error 방지하는 법

send/recv의 반환값은 처리된 바이트 수다. 따라서 partial 에러가 발생할 수 있기 때문에 buf 크기만큼 처리해야 하는 코드가 반드시 필요하다. 아래 코드는 buf의 주소는 늘리면서, 또한 그만큼 보낼 데이터의 양은 줄이면서 parital 에러를 방지하게 된다 문제가 발생하는 원인은 TCP는 데이터의 경계가 존재하지 않는다. 따라서 TCP로 구현을 한다면 둘 이상의 패킷 전송으로 데이터 전송을 완료할 수 있다. 따라서 클라이언트 쪽에서 한 번만 read를 한다면 partial error가 발생할 수 있다. 결론적으로는 TCP 전송계층에서 서버는 한 번의 write를 작성할 수 있짐나, 운영체제가 내부적으로 나눠서 전송할 수 있다

2019. 7. 23. 00:36
tcp bind 에러 원인과 해결법과 SO_REUSEADDR

TIME_WAIT는 연결이 중심이 되는 TCP에서 끊어진 연결과 새로운 연결을 구분짓기 위해서(데이터 무결성을 위해) 생겨났다. 소켓이 닫힌 후 일정 시간 동안 커널에서 해당 포트 바인드를 막음으로써 위와 같은 문제를 해결할 수 있다 약 90초 동안의 TIME_WAIT 시간을 가져서 bind를 막게 되는데, UNIX에서는 이 시간을 건드리지 말라고 한다. 하지만 복잡하지 않는 TCP 소스코드라면 소켓 설정을 달리해서 bind 에러를 막을 수 있다 int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); level은 소켓, IP, TCP 레벨이 있으며, optname에 SO_REUSEADDR을 지정해 주..

2019. 7. 22. 19:56
SOCK_DGRAM은 read/write 사용할 수 없는 이유

유닉스에서 소켓은 결국 하나의 소켓파일로 다뤄진다. 따라서 저수준 파일 제어에서 사용되는 read, write를 사용할 수 있을까라는 질문에는 서버의 연결 유무가 결정한다 결론적으로는 TCP는 서버와 연결된 상태에서 데이터 송수신을 하기 때문에 send, recv를 write, read로 대체할 수 있다. 하지만 SOCK_DGRAM인 UDP는 서버와 통신할 때 연결된 상태에서 하지 않는다. sendto, recvfrom의 API를 보면 데이터만 전달하는 것이 아닌 보낸 곳을 명시를 하게 된다. 따라서 SOCK_DGRAM은 read/write 사용할 수 없게 된다

2019. 7. 22. 14:54
동작 중인 포트 조회해서 지우기

$ netstat -tulpn 사용 중인 stream의 bind된 PID를 찾아서 kill 명령어로 프로세스를 종료시킨다 [출처] : https://stackoverflow.com/questions/15198834/bind-failed-address-already-in-use/15199016

2019. 7. 22. 13:56
TCP 네트워크 프로그래밍 - 1

TCP는 연결 기반의 신뢰성 있는 통신 방식으로 FTP, 메일, 웹 서비스 등 인터넷을 이용한 다양한 서비스에서 사용되고 있다. 신뢰성을 추구하다보니 UDP보다는 복잡한 절차와 방식으로 서버와 클라이언트가 구현된다 bind() 하는 과정은 UDP 서버와 동일하다. UDP와는 다르게, TCP는 클라이언트가 3 Way Handshaking을 통해서 서버에 접속하기 때문에, 클라이언트의 대기를 처리하는 큐가 필요하다. 이를 위해 listen 함수를 오해 대기 큐를 설정하고, accept를 통해서 클라이언트의 접속을 기다릴 수 있다. 참고로 3 Way Handshaking은 신뢰성 있는 연결을 위해 3번의 패킷 교환(SYN, SYN/ACK, ACK)으로 연결하는 동작을 의미한다 TCP 클라이언트는 connect..

2019. 7. 22. 00:34
1 ··· 10 11 12 13 14 15 16 17
티스토리
© 2018 TISTORY. All rights reserved.

티스토리툴바