SOCKET skt_connect(skt_ip_t ip, int port, int timeout)
{
  struct sockaddr_in addr=skt_build_addr(ip,port);
  int                ok, begin;
  SOCKET             ret;
  
  begin = time(0);
  while (time(0)-begin < timeout) 
  {
    ret = socket(AF_INET, SOCK_STREAM, 0);
    if (ret==SOCKET_ERROR) 
    {
	  if (skt_should_retry()) continue;  
      else return skt_abort(93512,"Error creating socket");
    }
    ok = connect(ret, (struct sockaddr *)&(addr), sizeof(addr));
    if (ok != SOCKET_ERROR) 
	  return ret;/*Good connect*/
	else { /*Bad connect*/
	  skt_close(ret);
	  if (skt_should_retry()) continue;
	  else return skt_abort(93515,"Error connecting to socket\n");
    }
  }
  /*Timeout*/
  return skt_abort(93517,"Timeout in socket connect\n");
}
Beispiel #2
0
/*Send a Ccs reply down the given socket.
Closes the socket afterwards.
A CcsImplHeader len field equal to 0 means do not send any reply.
*/
void CcsServer_sendReply(CcsImplHeader *hdr,int repBytes,const void *repData)
{
  int fd=ChMessageInt(hdr->replyFd);
  skt_abortFn old;
  if (ChMessageInt(hdr->len)==0) {
    CCSDBG(("CCS Closing reply socket without a reply.\n"));
    skt_close(fd);
    return;
  }
  old=skt_set_abort(reply_abortFn);
  CCSDBG(("CCS   Sending %d bytes of reply data\n",repBytes));
  CcsServer_writeReply(fd,security,&hdr->attr,repBytes,(char *)repData);
  skt_close(fd);
  CCSDBG(("CCS Reply socket closed.\n"));
  skt_set_abort(old);
}
Beispiel #3
0
/***********************************************
Send the given data as a CCS reply on the given socket.
Goes to some effort to minimize the number of "sends"
(and hence outgoing TCP packets) by assembling the 
header and data in-place.
*/
static void CcsServer_writeReply(SOCKET fd,
			 CcsSecMan *security,
			 CcsSecAttr *attr,
			 int replyLen,char *reply)
{
  const void *bufs[3]; int lens[3]; int nBuffers=0;
  struct { /*Authentication header*/
    SHA1_hash_t hash;
  } aheader;
  struct { /*Reply header*/
    ChMessageInt_t len;
  } header;
  if (attr->auth==1) 
  { /*Compose a reply SHA-1 hash header*/
    CCS_AUTH_hash(security->getKey(security,attr),
		  ChMessageInt(attr->replySalt),NULL,&aheader.hash);
    bufs[nBuffers]=&aheader; lens[nBuffers]=sizeof(aheader); nBuffers++;
  }
  /*Compose a simple reply header*/
  header.len=ChMessageInt_new(replyLen);
  bufs[nBuffers]=&header; lens[nBuffers]=sizeof(header); nBuffers++;
  bufs[nBuffers]=reply; lens[nBuffers]=replyLen; nBuffers++;
  if (-1==skt_sendV(fd,nBuffers,bufs,lens)) return;
  skt_close(fd);
#undef n
}
Beispiel #4
0
int CcsServer_recvRequest(CcsImplHeader *hdr,void **reqData) 
{
  char ip_str[200];
  skt_ip_t ip;
  unsigned int port,ret=1;
  SOCKET fd;
  skt_abortFn old=skt_set_abort(req_abortFn);

  CCSDBG(("CCS Receiving connection...\n"));
  fd=skt_accept(ccs_server_fd,&ip,&port);

  CCSDBG(("CCS   Connected to IP=%s, port=%d...\n",skt_print_ip(ip_str,ip),port));
  hdr->attr.ip=ip;
  hdr->attr.port=ChMessageInt_new(port);

  if (0==CcsServer_recvRequestData(fd,hdr,reqData))
  {
    fprintf(stdout,"During CCS Client IP:port (%s:%d) processing.\n",
	    skt_print_ip(ip_str,ip),
	    port);
    skt_close(fd);
    ret=0;
  }

  CCSDBG(("CCS   Got all %d data bytes for request.\n",reqBytes));
  skt_set_abort(old);

  return ret;
}
Beispiel #5
0
SOCKET skt_connect(skt_ip_t ip, int port, int timeout)
{
  struct sockaddr_in addr=skt_build_addr(ip,port);
  int                ok, begin;
  SOCKET             ret;
  
  begin = time(0);
  while (time(0)-begin < timeout) 
  {
    ret = socket(AF_INET, SOCK_STREAM, 0);
    if (ret==SOCKET_ERROR) 
    {
	  if (skt_should_retry()) continue;  
      else return skt_abort(-1, 93512, "Error creating socket");
    }
    ok = connect(ret, (struct sockaddr *)&(addr), sizeof(addr));
    if (ok != SOCKET_ERROR) 
	  return ret;/*Good connect*/
	else { /*Bad connect*/
	  skt_close(ret);
	  if (skt_should_retry()) continue;
	  else {
#if ! defined(_WIN32) || defined(__CYGWIN__)
            if (ERRNO == ETIMEDOUT) continue;      /* time out is fine */
#endif
            return skt_abort(-1, 93515, "Error connecting to socket\n");
          }
    }
  }
  /*Timeout*/
  if (timeout==60)
     return skt_abort(-1, 93517, "Timeout in socket connect\n");
  return INVALID_SOCKET;
}
Beispiel #6
0
extern "C" void CcsImpl_kill(void)
{
  skt_set_abort(noMoreErrors);
  while (killList!=NULL)
  {
    SOCKET fd=skt_connect(killList->ip,killList->port,20);
    if (fd!=INVALID_SOCKET) {
      skt_sendN(fd,"die\n",strlen("die\n")+1);
      skt_close(fd);
    }
    killList=killList->next;
  }
}
Beispiel #7
0
// Main network access function:
void handle_client(SOCKET s, bool intranet) {
	std::string status="Server ";
	status+=get_address(&status);
	status+=": ";
	if (working_OK) status+="TOTALLY OK";
	else status+="not really ok";

	status+=", hackability=";
	if (is_hackable) status+="high";
	else status+="not so much";
	
	status+=".  Your name?\n";
	skt_sendN(s,&status[0],status.size());
	
	std::string name=skt_recv_line(s);
	if (is_hackable && intranet) {
		old_say_hello(&name[0]);
	} else {
		std::cout<<"Hello, "<<name<<"\n";
	}
	
	skt_close(s);
}
Beispiel #8
0
// Connection destructor
TCPConnection::~TCPConnection(){
    std::cout << "closing socket: " << _socket << "\n";
    _dead = true;
    skt_close(_socket);
}
Beispiel #9
0
unsigned char *download_url(const char *url_in, int verbose, int *length)
{
  char *url=STRDUP(url_in);

  // parse the url
  char *protocol, *host, *path;
  int port;
  parse_url(url, &protocol, &host, &port, &path);

  if (verbose)
    printf("Connecting to URL: %s://%s:%d%s\n", protocol, host, port, path);

  int timeout = 60;
  if (verbose)
    printf("Looking up IP Address for: %s\n", host);
  skt_ip_t hostIP = skt_lookup_ip(host);
  if (verbose)
    printf("Connecting to %s\n", host);
  SOCKET s = skt_connect(hostIP, port, timeout);

  char *send_get = MALLOC(strlen(url)+128);
  sprintf(send_get,
          "GET %s HTTP/1.1\r\n"
          "Host: %s\r\n"
          "User-Agent: Mozilla/5.0\r\n"
          "\r\n", path, host);

  // send our get request
  skt_sendN(s, send_get, strlen(send_get));

  // wait...
  if (verbose)
    printf("Waiting for a response from %s\n", host);
  char *status = skt_recv_line(s);
  if (verbose)
    printf("Received status: %s\n", status);
  //char *status_trim = trim_spaces(status);
  free(status);

  // now can get the response code
  //int code = atoi(status_trim);
  //free(status_trim);

  // a zero-length line indicates the end of the HTTP headers... we ignore
  int len=-1;
  while (1) {
    char *line = skt_recv_line(s);
    if (strlen(line)==0) break;
    if (strstr(line, "Content-Length") != 0) {
      char *l = line + strlen("Content-Length") + 2;
      len=atoi(l);
    }
  }
  if (verbose)
    printf("Content Length: %d\n", len);

  if (len==-1) {
    asfPrintWarning("No Content-Length specified in the HTTP headers.\n");
    return NULL;
  }

  // receiving data...
  unsigned char *data = CALLOC(len+12, sizeof(char));
  int curr=0, chunkSize=1024;
  while (1) {
    int amt = chunkSize < len-curr ? chunkSize : len-curr;
    skt_recvN(s,data+curr,amt);
    curr += amt;
    if (verbose)
      printf("Retrieved %d Kb so far.\n", curr);
    if (curr==len)
      break;
    else if (curr>len)
      asfPrintError("Invalid Content-Length?\n");
  }

  if(verbose)
    printf("Done.\n");
  //if (verbose)
  //  printf("Received data:\n"
  //         "-------------------------------------------------------------\n"
  //         "%s\n"
  //         "-------------------------------------------------------------\n",
  //         data);

  free(protocol);
  free(host);
  free(path);
  free(url);
  free(send_get);
  skt_close(s);

  *length = len;
  return data;
}
Beispiel #10
0
Datei: udp.c Projekt: gozfree/src
static void udp_close(struct protocol_ctx *sc)
{
    struct udp_ctx *c = sc->priv;
    return skt_close(c->fd);
}
Beispiel #11
0
void ctrl_c_op(int signo)
{
    skt_close(_rpcd->listen_fd);
    exit(0);
}