libmodbus 사용하면 희한하게 일정 시간 이후에나 해당 소켓이 사용가능하도록 풀리는데
libmodbus가 종료시 제대로 bind를 풀어주지 않아 발생하는 것으로 예측만 했는데, 일단은~ 회피법을 찾은 듯.
SO_REUSEADDR
[링크 : https://www.inflearn.com/questions/20648/%EC%97%90%EB%9F%AC-bind-address-already-in-use]
딱 내가 겪고 있던 증상
이는 기존 프로그램이 종료되었지만, 비정상종료된 상태로 아직 커널이 bind정보를 유지하고 있음으로 발생하는 문제다. 보통 1-2분 정도 지나만 커널이 알아서 정리를 하긴 하지만, 그 시간동안 기달려야 한다는 것은 상당히 번거로운 일이다. 이 경우 다음과 같은 코드를 삽입함으로써 문제를 해결할 수 있다. int sock = socket(...); setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&bf, (int)sizeof(bf)); 이렇게 하면 커널은 기존에 bind로 할당된 소켓자원을 프로세스가 재 사용할 수 있도록 허락한다. |
[링크 : https://www.joinc.co.kr/w/Site/Network_Programing/AdvancedComm/SocketOption]
+
2023.08.01
int option; server_socket = socket( PF_INET, SOCK_STREAM, 0); option = 1; // SO_REUSEADDR 의 옵션 값을 TRUE 로 setsockopt( server_socket, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option) ); |
[링크 : https://m.blog.naver.com/cache798/130080237440]
프로토 타입은 아래와 같은데 SO_REUSEADDR 은 optname으로 level이 SOL_SOCKET 이라..
optval에는 또 어떻게 넣어줘야 하려나
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); |
'Linux API > network' 카테고리의 다른 글
recv 와 read 차이 (0) | 2023.06.23 |
---|---|
AF_PACKET로 link layer 열기 (0) | 2022.06.09 |
linux tcp server listen accept connect (0) | 2022.05.11 |
ssl socket 예제 (0) | 2022.03.25 |
TCP timeout (0) | 2020.09.29 |