setsockopt () 와 getsockopt () 함수 - 해결 주 소 는 재 활용 할 수 없습니다. 즉, Address already in use 입 니 다.
6076 단어 socket
Linux socket (bug); 。
: , IP”192.168.1.234″ Port”12357″ 。 , recvfrom , ctrl+z 。
, ::
Address already in use // 。
::
Linux , 。
::
sockfd , socket() , setsockopt sockfd (options)。
Linux ::
#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int sockfd,int level,int name,char *value,int optlen);
int setsockopt(int scokfd,int level,int name,char *value,int *optlen);
::
sockfd sockfd,setsockopt socket() 。
level (protocol level),Linux ,
SOL_SOCKET, TCP/IP IPPROTO_TCP,
。
name , :SO_REUSEADDR, 。
SO_BROADCAST, sockfd fd。
man ,name , 。
value setsockopt ,getsockopt 。
optlen value ,value 。
:: ( , Address already use)。
/* */
int sockfd = socket(AF_INET,SOCK_DGRAM SOCK_STREAM,0);
/* , value optlen */
int opt = 1;
int len = sizeof(opt);
/* , */
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,len);
::
setsockopt ( ) ,
getsockopt 。getsockopt, sockfd opt 。
getsockopt , 。
코드 예 src. c: ctrl + c 를 누 르 면 강제로 종 료 된 후 포트 에 사용 할 수 없 는 프로그램 이 나타 납 니 다 (Address already use)
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <error.h>
#include <unistd.h>
#include <netinet/in.h>
#define MAX_LINE 4096
int main(int argc,char *argv[])
{
struct sockaddr_in srvaddr;
struct sockaddr_in cltaddr;
int socklen=sizeof(struct sockaddr_in);
int sockfd;
char msgbuf[MAX_LINE];
int msglen;
int opt = 1;
int len = sizeof(opt);
srvaddr.sin_family = AF_INET;
srvaddr.sin_addr.s_addr = inet_addr(“172.25.81.16”);
srvaddr.sin_port = htons(12357);
bzero(srvaddr.sin_zero,sizeof(srvaddr.sin_zero));
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd == -1)
{
perror(“creat socket fd fail:”);
exit(1);
}
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(char *)&opt,len)==-1)
{
perror(“setsockopt fail:”);
close(sockfd);
exit(1);
}
if(bind(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr_in))==-1)
{
perror(“bind socket fd fail:”);
close(sockfd);
exit(1);
}
memset(msgbuf,0,MAX_LINE);
msglen = recvfrom(sockfd,msgbuf,MAX_LINE,0,(struct sockaddr *)&cltaddr,&socklen);
if(msglen < 0)
{
perror(“recv data fail:”);
close(sockfd);
exit(1);
}
else
{
msgbuf[msglen] = ‘\0’;
printf(“recv data from clt:%s
”,msgbuf);
memset(msgbuf,0,MAX_LINE);
strcpy(msgbuf,”hello clt!”);
sendto(sockfd,msgbuf,strlen(msgbuf),0,(struct sockaddr *)&cltaddr,socklen);
close(sockfd);
}
return 0;
}
src 로 컴 파일 되 었 습 니 다. 실행 과정 에서 ctrl + c 를 누 르 면 프로그램 을 종료 하고 다시 시작 할 때 포트 를 다시 사용 할 수 있 습 니 다 (중복 사용).문제 없 을 겁 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.