티스토리 뷰

반응형

UNIX C (Sun)을 하다보면 자주 사용하게 되죠..

 

참고로 하심 좋습니다. GCC Compiler에서 사용해야 합니다. 

 

 int LIB_CONNECT_CLIENT(char *pIP, int nPort)
{
   struct  sockaddr_in serv_addr;
   int on=1, nLen=0,nStatus=0 ;
   int nFlags = 0;
   int nSocket;
   fd_set rset, wset;
   extern int errno;
   struct timeval!  tv = {2,0L};

    if((nSocket= socket( AF_INET, SOCK_STREAM, 0 )) < 0 )
    {
  Log(WARRG,"D[%s:%d] Error Code [%d] \n", __FUNCTION__, __LINE__, nSocket);
        return(-1347);
    }
 
 Log(WARRG,"D[%s:%d] ip[%s] Port[%d] \n", __FUNCTION__, __LINE__, pIP, nPort);

    memset ( (char *) &serv_addr, 0, sizeof (serv_addr) );
    serv_addr.sin_family         = AF_INET;
    serv_addr.sin_addr.s_addr    = inet_addr ( pIP );
    serv_addr.sin_port           = htons ( nPort );
 
    setsockopt(nSocket, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
 
 nFlags = fcntl(nSocket, F_GETFL, 0);

 if(fcntl(nSocket, F_SETFL, nFlags | O_NONBLOCK) < 0) 
 {
      Log(WARRG, "D[%s:%d] Error No Code [%d] Msg[%s]\n",  __FUNCTION__, __LINE__, errno,strerror(errno) );
     close(nSocket);
    return (-1347);
 }

 Log(TRACE,"D[%s:%d] Last Error No Code [%d] Msg[%s] \n", __FUNCTION__, __LINE__, errno, strerror(errno));
 
 nStatus = connect(nSocket,(struct sockaddr *)&serv_addr, sizeof(serv_addr));

 if ((errno != EINPROGRESS) && (errno != 0))
 {
  close(nSocket);
       Log(WARRG,"D[%s:%d] Error No Code [%d] Msg[%s] \n", __FUNCTION__, __LINE__, errno, strerror(errno));
  return(-1347); // inprogress error
 }

 if(nStatus != 0)
 {

  FD_ZERO (&rset);
  FD_SET (nSocket, &rset);
  wset = rset;

  if ((nStatus = select(nSocket + 1, &rset, &wset, NULL,  &tv)) == 0)
  {   
   close(nSocket);
     Log(WARRG,"D[%s:%d] Error No  select=%d Msg[%s]\n", __FUNCTION__, __LINE__, nStatus, strerror(errno));
   return (-1348);
  }

    if (FD_ISSET(nSocket, &rset) || FD_ISSET(nSocket, &wset)) 
    {
   nLen = sizeof(errno);
   if (getsockopt(nSocket, SOL_SOCKET, SO_ERROR, &errno, (socklen_t*)&nLen) < 0)
   {
       Log(WARRG,"D[%s:%d] Error No Code [%d] Msg[%s] \n", __FUNCTION__, __LINE__, errno, strerror(errno));
     close(nSocket);
     return (-1347);
   }

  } 
 }

    fcntl(nSocket, F_SETFL, nFlags);

 if ( errno )
 {
  close(nSocket);
  Log(WARRG, "D[%s:%d] Error No Code [%d] Msg[%s]  \n", __FUNCTION__, __LINE__, errno,strerror(errno));
  return(-1347);  // select error
 }

 return (nSocket);
}
반응형

'개발자 이야기 > Unix C & C++' 카테고리의 다른 글

OpenSource Linux Crontab Source  (0) 2025.01.03
gSOAP Linux86-64에서 컴파일 하기  (0) 2018.10.07
VirtualBox Frame Buffer 환경  (0) 2018.02.05
dns named mrtg  (0) 2017.02.15
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함