示例#1
0
int setup_back_inet_socket(char *backend, int f[2])
{
  struct sockaddr_in sa;
  int fd;

  sa = inet_resolve(backend);
  if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 3)
    errorf("Couldn't open socket: %s\n",strerror(errno));

  if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) != 0)
    errorf("Couldn't connect socket: %s\n", strerror(errno));

  return f[0]=f[1]=fd;
}
示例#2
0
int setup_front_inet_socket(char *sockname, int f[2])
{
  struct sockaddr_in sa;
  int reuse_flag = 1;
  
  sa = inet_resolve(sockname);
  
  if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 3)
    errorf("Couldn't open socket: %s\n",strerror(errno));
  if (setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR,&reuse_flag,sizeof(reuse_flag)) < 0)
    errorf("Couldn't make socket reusable: %s\n",strerror(errno));
  if (bind(listenfd, (struct sockaddr *)&sa, sizeof(sa)) < 0)
    errorf("Couldn't bind to inet socket: %s\n",strerror(errno));
  if (listen(listenfd,5) < 0)
    errorf("Couldn't listen on unix socket: %s\n",strerror(errno));

  return f[0]=f[1]=accept(listenfd,NULL,NULL);
}
示例#3
0
文件: http_req.c 项目: noelbk/bklib
int
http_get(char *urlstr, http_req_func_t func, void *farg) {
    url_t url;
    struct sockaddr_in iaddr;
    sockaddrlen_t addrlen;
    int i, err=-1;
    sock_t sock;
    int url_parsed=0;
    char buf[16384], buf1[1024];
    size_t len=0;
    http_header_t http;
    http_req_t req;
    int got_header = 0;
    http_req_error_t req_err = 0;

    do {
	memset(&req, 0, sizeof(req));
	req.req_url = &url;
	req.reply_hdr = &http;

	req_err = HTTP_REQ_ERROR_BAD_URL;
	i = url_parse(&url, urlstr);
	assertb(i==0);
	url_parsed = 1;

	if( strcasecmp(url.proto, "file") == 0 ) {
	    struct stat st;	
	    FILE *f=0;
	    req_err = HTTP_REQ_ERROR_FILE_NOT_FOUND;
	    do {
		i = stat(url.path, &st);
		assertb(i==0);
		http.content_len = st.st_size;
		req.req_state = HTTP_REQ_BODY;
		f = fopen(url.path, "r");
		assertb(f);
		while(1) {
		    len = fread(buf, 1, sizeof(buf), f);
		    if( len < 0 ) {
			req_err = HTTP_REQ_ERROR_INCOMPLETE;
			break;
		    }
		    if( len <= 0 ) break;
		    err = func(&req, buf, len, farg);
		    if( err ) break;
		}
		req_err = 0;
		err = 0;
	    } while(0);
	    if( f ) {
		fclose(f);
	    }
	    break;
	}
	
	req_err = HTTP_REQ_ERROR_BAD_URL;
	assertb( strcasecmp(url.proto, "http") == 0 );

	req_err = HTTP_REQ_ERROR_CONNECT;
	sock = socket(AF_INET, SOCK_STREAM, 0);
	assertb_sockerr(sock>=0);

	req.req_state = HTTP_REQ_RESOLVE;
	i = snprintf(buf, sizeof(buf), "resolving host %s\n", url.host);
	err = func(&req, buf, i, farg);
	if( err != 0 ) break;

	addrlen = iaddr_pack(&iaddr, inet_resolve(url.host), url.port);

	req.req_state = HTTP_REQ_CONNECT;
	i = snprintf(buf, sizeof(buf), "connecting to host %s at %s\n"
		     ,url.host
		     ,iaddr_fmt(&iaddr, buf1, sizeof(buf1))
		     );
	err = func(&req, buf, i, farg);
	if( err != 0 ) break;

	i = connect(sock, (struct sockaddr*)&iaddr, addrlen);
	assertb_sockerr(i==0);
	
	i = snprintf(buf, sizeof(buf),
		     "GET %s HTTP/1.0\r\n"
		     "Host: %s\r\n"
		     "\r\n"
		     ,url.path_args
		     ,url.host
		     );

	req.req_state = HTTP_REQ_SEND;
	err = func(&req, buf, i, farg);
	if( err != 0 ) break;

	i = sock_send_timeout(sock, buf, i, 5000);
	assertb(i>=0);

	len = 0;
	got_header = 0;
	while(1) {
	    assertb( len < sizeof(buf) );
	    i = recv(sock, buf+len, sizeof(buf)-len, 0);
	    if( i < 0 ) {
		warn_sockerr(sock);
		req_err = HTTP_REQ_ERROR_INCOMPLETE;
		break;
	    }

	    if( i == 0 ) {
		req.req_state = HTTP_REQ_EOF;
		err = func(&req, 0, 0, farg);
		break;
	    }
	    len += i;

	    if( !got_header ) {
		http_header_init(&http, 0);
		i = http_header_parse(&http, buf, len);
		if( i < 0 ) {
		    req_err = HTTP_REQ_ERROR_BAD_RESPONSE;
		    break;
		}
		if( i == 0 ) {
		    continue;
		}
		got_header = 1;

		req.reply_max = http.content_len;
		req.req_state = HTTP_REQ_HEAD;
		err = func(&req, buf, http.header_len, farg);
		if( err != 0 ) {
		    break;
		}

		len -= http.header_len;
		if( len > 0 ) {
		    memmove(buf, buf+http.header_len, len);
		}
	    }

	    if( got_header ) {
		req.reply_len += len;
		req.req_state = HTTP_REQ_BODY;
		err = func(&req, buf, len, farg);
		len = 0;
		if( err ) {
		    break;
		}
	    }
	}
	req_err = 0;
    } while(0);

    if( got_header && http.response_code != 200 ) {
	req_err = HTTP_REQ_ERROR_FILE_NOT_FOUND;
    }

    if( req_err ) {
	req.req_state = HTTP_REQ_ERROR;
	req.req_error = req_err;
	err = func(&req, buf, len, farg);
    }

    if( url_parsed ) {
	url_free(&url);
    }

    if( got_header ) {
	http_header_free(&http);
    }
    return err;
}
示例#4
0
int
main(int argc, char **argv) {
    char *ns, *hostname;
    sock_t sock;
    struct sockaddr_in addr;
    sockaddrlen_t addrlen;
    char buf_query[4096];
    char buf_reply[4096];
    char buf_out[4096];
    char buf[4096];
    dns_rr_t hosts[100];
    int i, n, err=-1;
    int id;
    dns_t dns_reply;

    do {
	debug_init(DEBUG_INFO, 0, 0);
	sock_init();

	if( argc <= 2 ) {
	    fprintf(stderr, "USAGE: %s nameserver hostname\n", argv[0]);
	    break;
	}
	ns = argv[1];
	hostname = argv[2];

	i = dns_resolve_query(buf_query, sizeof(buf_query), hostname, 977);
	assertb(i>=0);
	memdump(buf_out, sizeof(buf_out), buf_query, i);
	fprintf(stderr, "query: len=%d\n%s\n", i, buf_out);
	
	/* send the query to ns*/
	sock = socket(PF_INET, SOCK_DGRAM, 0);
	assertb_sockerr(sock>=0);
	addrlen = iaddr_pack(&addr, inet_resolve(ns), 53);
	assertb(addrlen>0);
	n = sendto(sock, buf_query, i, 0,
		   (struct sockaddr*)&addr, addrlen);
	assertb_sockerr(n==i);

	/* receive a response */
	n = recvfrom(sock, buf_reply, sizeof(buf_reply), 0,
		     (struct sockaddr*)&addr, &addrlen);
	assertb_sockerr(n>0);

	debug(DEBUG_INFO,
	      ("recvfrom raw query from %s\n%s\n"
	       , netpkt_ntoa(addr.sin_addr.s_addr, 0)
	       , memdump(buf_out, sizeof(buf_out), buf_reply, n)
	       ));
	
	dns_init(&dns_reply, buf_reply, n);
	dns_pack(&dns_reply, PACK_NET2HOST);
	debug(DEBUG_INFO,  
	      ("dns answer %s\n"
	       ,dns_fmt(&dns_reply, buf, sizeof(buf))));
	
	n = dns_resolve_reply(buf_reply, n, &id, hosts, NELTS(hosts));
	for(i=0; i<n; i++) {
	    fprintf(stderr, "hosts[%d]: %s=%s\n", i,
		    hosts[i].name, netpkt_ntoa(hosts[i].rdata.a.addr, 0));
	}
    } while(0);

}