setsockopt () 와 getsockopt () 함수 - 해결 주 소 는 재 활용 할 수 없습니다. 즉, Address already in use 입 니 다.

6076 단어 socket
전송:http://blog.163.com/xychenbaihu@yeah/blog/static/1322296552011215111017599/
    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 를 누 르 면 프로그램 을 종료 하고 다시 시작 할 때 포트 를 다시 사용 할 수 있 습 니 다 (중복 사용).문제 없 을 겁 니 다.

좋은 웹페이지 즐겨찾기