오류: 소켓을 주소로 바인딩하는 동안 주소가 이미 사용 중이지만 포트 번호가 'netstat'로 비어 있습니다.
소켓(서버 소켓)을 포트 번호로 바인드하려고 했습니다.8000그것은 효과가 있었고 나에게도 효과가 있었다.코드가 끝나면 소켓도 닫습니다.바로 다음 순간에 코드를 다시 실행하면 주소가 이미 사용 중임을 알 수 있습니다.오차값의 의미를 인쇄했습니다.strerror(errno);각 지점에서 코드가 제대로 작동하는지 확인합니다.포트가 비어 있는지 확인하기 위해 다음을 사용하여 확인했습니다.netstat단, 포트번호는8000무료입니다.나는 그런 일이 여러 번 있었다.그때마다 몇 초만 더 기다리면 다시 작동하기 시작합니다.저는 c언어를 사용하고 있습니다.그렇다면 OS가 이 동작을 하는 이유는 무엇일까요?
몇 초 후에 코드를 실행해 보면 동작합니다.
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo ./a.out
Socket Creation: Success
File open: Success
Socket Bind: Address already in use
Socket Listen: Address already in use
^C
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1348/lighttpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 984/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1131/cupsd
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1211/mysqld
tcp6 0 0 :::22 :::* LISTEN 984/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1131/cupsd
anirudh@anirudh-Aspire-5920:~/Desktop/testing$ sudo ./a.out
Socket Creation: Success
File open: Success
Socket Bind: Address already in use
Socket Listen: Address already in use
^C
anirudh@anirudh-Aspire-5920:~/Desktop/testing$
저도 같은 문제에 부딪힌 적이 있어요.소켓에 대한 연결을 닫지만 소켓 자체는 닫지 않기 때문입니다.소켓은 TIME_WAIT 상태가 될 수 있으며(모든 데이터가 전송되었는지 확인하기 위해 가능하면 TCP가 전달을 보증함) 해제하는 데 최대 4분이 걸립니다.
또는, 이 링크에서, 정말로 상세한/기술에 대한 설명을 참조해 주세요.
확실히 짜증나긴 하지만 벌레는 아니야.다음 답변에 대한 @Vereb의 코멘트를 참조해 주십시오.SO_REUSEADDR.
질문이 있은 지 한참이 지났지만 해결책을 찾을 수 있었습니다.
int sockfd;
int option = 1;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
이것에 의해, 소켓은 즉시 재이용할 수 있게 됩니다.
잘못되었다면 사과드립니다.소켓에 대한 경험이 별로 없습니다.
이미 언급했듯이 소켓은 아마TIME_WAIT 이 문제는 토마스 A에 의해 잘 설명되어 있습니다. 여기가 좋아요.
소켓의 클로징 프로세스를 정리하면, 다음의 그림을 참조해 주세요.
Thomas는 다음과 같이 말합니다.
위의 그림을 보면,
TIME_WAIT리모트 엔드가 폐쇄를 개시하는 경우, 회피할 수 있습니다.따라서 서버는 클라이언트를 먼저 닫는 것으로 문제를 방지할 수 있습니다.응용 프로그램 프로토콜은 클라이언트가 닫을 시기를 알 수 있도록 설계되어야 합니다.서버는 클라이언트로부터의 EOF에 응답하여 안전하게 닫을 수 있지만 클라이언트가 네트워크를 정상적으로 탈퇴한 경우에 대비하여 EOF를 예상할 때 타임아웃을 설정해야 합니다.대부분의 경우 서버가 닫힐 때까지 몇 초만 기다리면 충분합니다.
「」를 사용합니다.SO_REUSEADDR는 일반적으로 인터넷에서 권장되지만 Thomas는 다음과 같이 덧붙입니다.
하게도 ★★★★★★★★★★★★★★★★★.
SO_REUSEADDR에서는, 「 address in에러가 이 있습니다.SO_REUSADDR에서는, 에 막혀 할 수 .TIME_WAIT이 할 수 없습니다.네? 1010을com 300에 하여 로컬로를 foobar.com에 .TIME_WAIT포트 하여 1010 할 수foobar.com300파운드입니다.
를 다음과 사용해 .netstat -ntp 없는 경우,-l에됩니다.TIME_WAITdiscloss.discloss.conf.
그냥 입력해 주세요.
unlink [SOCKET NAME]
에러가 발생하지 않게 됩니다.
받은 오류는 다음과 같습니다.
cockpit.socket: Failed to listen on sockets: Address already in use
내가 발견한 수정사항은:
- selinux를 비활성화해야 했습니다.
/usr/lib/systemd/system/syslog service i에서 회선을 변경했습니다.
#ExecStartPre=/usr/sbin/remotectl certificate --ensure --user=root --group=cockpit-ws --selinux-type=etc_t대상:
#ExecStartPre=/usr/sbin/remotectl certificate --ensure --user=root --group=cockpit-ws
보시다시피 selinux에 대한 인수를 제거하고 다음을 실행했습니다.
systemctl daemon-reload
systemctl start cockpit.service
그 후, 다음과 같이 검색했습니다.
자기서명증명서를 받아 cockpit에 정상적으로 로그인하여 정상적으로 사용할 수 있었습니다.
는 9090 포트로 이미 되어 있습니다.firewall-cmd
이 질문에 대한 icfantv의 답변은 이미 완벽하지만, 나는 여전히 내 테스트에서 더 많은 결과를 얻었다.
리스닝 상태의 서버 소켓으로서 리스닝 상태의 서버 소켓으로서 클라이언트 측으로부터의 요구와 데이터 취득을 받아들이지만 데이터 송신 액션은 받지 않습니다.서버가 정지된 후에도 즉시 재시작할 수 있습니다.다만, 서버측에서 클라이언트에의 데이터 송신 액션이 발생했을 경우는, 같은 서비스(같은 포토)를 재기동하면, 다음의 에러가 발생합니다(주소는 이미 사용되고 있습니다).
이것은 TCP/IP 설계 원리에 의한 것이라고 생각합니다.서버에서 클라이언트에 데이터를 다시 보낼 때 데이터 전송이 성공하는지 확인해야 합니다. 그러기 위해서는 서버 응용 프로그램이 소켓을 닫더라도 OS(Linux)가 연결을 모니터링해야 합니다.하지만 저는 커널 소켓 디자이너가 이 문제를 개선할 수 있다고 믿습니다.
AF_UNIX의 경우 "server" 앱에서 close() 소켓 뒤에 콜 링크 해제(패스)를 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/5106674/error-address-already-in-use-while-binding-socket-with-address-but-the-port-num
'programing' 카테고리의 다른 글
| String.equals 대 == (0) | 2022.08.29 |
|---|---|
| Vue 인스턴스 시작 시 Vuex 자체 내에서 액션을 디스패치할 수 있습니까? (0) | 2022.08.29 |
| 오류 발생 중 오류: [vuex] getters가 기능해야 하지만 저장소를 모듈로 분할할 때 VUEX 저장소에서 "getters.getters"가 {}입니다. (0) | 2022.08.29 |
| Vue router-link가 URL을 변경하지만 라우터 뷰 컴포넌트는 변경하지 않음 (0) | 2022.08.29 |
| Java에서 유효한 @Suppress Warnings 경고 이름 목록은 무엇입니까? (0) | 2022.08.28 |
