Exemple #1
0
/**
 * main_client_native - it handles the functionality of the client-native
 * @param proto type of protocol
 * @param socktype the type of socket
 * @param peer_name the peer name
 * @param peer_port_name the prot number
 *
 * @return 1 with success, 0 otherwise.
 */
int main_client_native(int socktype, char *peer_name, char *peer_port_name)
{
	//struct endpointinfo hints, *epinfo = NULL, *res = NULL;
	//struct endpointinfo *epinfo;
	struct addrinfo hints, *res = NULL;
	struct timeval stats_before, stats_after;
	struct sockaddr_hip peer_sock;
	unsigned long stats_diff_sec, stats_diff_usec;
	char mylovemostdata[IP_MAXPACKET];
	char receiveddata[IP_MAXPACKET];
	int recvnum, sendnum;
	int datalen = 0;
	int datasent = 0;
	int datareceived = 0;
	int ch;
	int err = 0;
	int sockfd = -1;
	se_family_t endpoint_family;

	endpoint_family = PF_HIP;

	sockfd = socket(endpoint_family, socktype, 0);
	HIP_IFEL(sockfd < 0, 1, "creation of socket failed\n");

#if 0
	/* set up host lookup information  */
	memset(&hints, 0, sizeof(hints));
	//hints.ei_socktype = socktype;
	//hints.ei_family = endpoint_family;
	hints.ai_socktype = socktype;
	hints.ai_family = endpoint_family;
	/* Use the following flags to use only the kernel list for name resolution
	 * hints.ei_flags = AI_HIP | AI_KERNEL_LIST;
	 */

	/* lookup host */
	//err = getendpointinfo(peer_name, peer_port_name, &hints, &res);
	if (err) {
		HIP_ERROR("getendpointfo failed\n");
		goto out_err;
	}
	//hints.ai_flags |= AI_EXTFLAGS;
	//hints.ai_eflags |= HIP_PREFER_ORCHID;

	err = getaddrinfo(peer_name, peer_port_name, &hints, &res);
	if (err) {
		HIP_ERROR("getaddrinfo failed (%d): %s\n", err, gepi_strerror(err));
		goto out_err;
	}
	if (!res) {
		HIP_ERROR("NULL result, TODO\n");
		goto out_err;
	}

/*
	HIP_DEBUG("family=%d value=%d\n", res->ei_family,
		  ntohs(((struct sockaddr_eid *) res->ei_endpoint)->eid_val));
*/
#endif

	/* XX TODO: Do a proper getaddrinfo() */
	memset(&peer_sock, 0, sizeof(peer_sock));
	peer_sock.ship_family = PF_HIP;
	HIP_IFEL(inet_pton(AF_INET6, peer_name, &peer_sock.ship_hit) != 1, 1, "Failed to parse HIT\n");
	peer_sock.ship_port = htons(atoi(peer_port_name));
	HIP_DEBUG("Connecting to %s port %d\n", peer_name, peer_sock.ship_port);

	// data from stdin to buffer
	memset(receiveddata, 0, IP_MAXPACKET);
	memset(mylovemostdata, 0, IP_MAXPACKET);

	printf("Input some text, press enter and ctrl+d\n");

	// horrible code
	while ((ch = fgetc(stdin)) != EOF && (datalen < IP_MAXPACKET)) {
		mylovemostdata[datalen] = (unsigned char) ch;
		datalen++;
	}

	gettimeofday(&stats_before, NULL);

#if 0
	epinfo = res;
	while(epinfo) {
		err = connect(sockfd, (struct sockaddr *) epinfo->ei_endpoint, epinfo->ei_endpointlen);
		//err = connect(sockfd, res->ai_addr, res->ai_addrlen);
		if (err) {
			HIP_PERROR("connect");
			goto out_err;
		}
		epinfo = epinfo->ei_next;
	}
#endif

	err = connect(sockfd, &peer_sock, sizeof(peer_sock));
	if (err) {
		HIP_PERROR("connect: ");
		goto out_err;
	}

	gettimeofday(&stats_after, NULL);
	stats_diff_sec  = (stats_after.tv_sec - stats_before.tv_sec) * 1000000;
	stats_diff_usec = stats_after.tv_usec - stats_before.tv_usec;

	HIP_DEBUG("connect took %.10f sec\n",
		  (stats_diff_sec + stats_diff_usec) / 1000000.0);

	/* Send the data read from stdin to the server and read the response.
	   The server should echo all the data received back to here. */
	while((datasent < datalen) || (datareceived < datalen)) {

		if (datasent < datalen) {
			sendnum = send(sockfd, mylovemostdata + datasent, datalen - datasent, 0);
      
			if (sendnum < 0) {
				HIP_PERROR("send");
				err = 1;
				goto out_err;
			}
			datasent += sendnum;
		}

		if (datareceived < datalen) {
			recvnum = recv(sockfd, receiveddata + datareceived,
				       datalen-datareceived, 0);
			if (recvnum <= 0) {
				HIP_PERROR("recv");
				err = 1;
				goto out_err;
			}
			datareceived += recvnum;
		}
	}

	HIP_IFEL(memcmp(mylovemostdata, receiveddata, IP_MAXPACKET),
				1, "Sent and received data did not match\n");

out_err:
	/*if (res)
		//free_endpointinfo(res);
		freeaddrinfo(res);*/
	if (sockfd > -1)
		close(sockfd); // discard errors

	HIP_INFO("Result of data transfer: %s.\n", (err ? "FAIL" : "OK"));

	return err;
}
Exemple #2
0
int main(int argc,char *argv[]) {
	struct endpointinfo hints, *epinfo, *res = NULL;
	struct sockaddr_ed *my_ed = NULL;
	struct timeval stats_before, stats_after;

	unsigned long stats_diff_sec, stats_diff_usec;
	char mylovemostdata[IP_MAXPACKET];
	char receiveddata[IP_MAXPACKET];
	char *proto_name, *peer_port_name, *peer_name;
	int recvnum, sendnum;
	int datalen = 0;
	int proto;
	int datasent = 0;
	int datareceived = 0;
	int ch;
	int err = 0;
	int sockfd = 0, socktype;

	struct se_family_t endpoint_family;

	char *user_key_base = "/etc/hip/hip_host_dsa_key";

	struct endpoint *endpoint;
	
	if (argc != 4) {
		printf("Usage: %s host tcp|udp port\n", argv[0]);
	err = 1;
	goto out;
	}

	peer_name = argv[1];
	proto_name = argv[2];
	peer_port_name = argv[3];
	endpoint_family = PF_HIP;

	/* Set transport protocol */
	if (strcmp(proto_name, "tcp") == 0) {
		proto = IPPROTO_TCP;
		socktype = SOCK_STREAM;
	} else if (strcmp(proto_name, "udp") == 0) {
		proto = IPPROTO_UDP;
		socktype = SOCK_DGRAM;
	} else {
		printf("Error: only TCP and UDP supported.\n");
		err = 1;
		goto out;
	}

	sockfd = socket(endpoint_family, socktype, 0);
	if (sockfd == -1) {
		printf("creation of socket failed\n");
		err = 1;
		goto out;
	}
	err = load_hip_endpoint_pem(user_key_base, &endpoint);
	if (err) {
		printf("Failed to load user HIP key %s\n", user_key_base);
		goto out;
	}
	my_ed = getlocaled(endpoint, NULL, NULL, NULL);
	if (!my_ed) {
		printf("Failed to set up my ED (%d)\n");
		err = 1;
		goto out;
	}

	/* We have to bind to the ED to use it. */
	err = bind(sockfd, (struct sockaddr *) &my_ed, sizeof(struct sockaddr_ed));
	if (err) {
		perror("bind failed");
		goto out;
	}

	/* set up endpoint lookup information */
	memset(&hints, 0, sizeof(struct endpointinfo));
	hints.ei_socktype = socktype;
	hints.ei_family = endpoint_family;

	/* Lookup endpoint. We do not need to call getpeered because
	getendpointinfo does it automatically. */
	err = getendpointinfo(peer_name, peer_port_name, &hints, &res);
	if (err) {
		printf("getendpointinfo failed (%d): %s\n", err, gepi_strerror(err));
		goto out;
	}
	printf("family=%d value=%d\n", res->ei_family,
	ntohs(((struct sockaddr_ed *) res->ei_endpoint)->ed_val));
	// data from stdin to buffer
	bzero(receiveddata, IP_MAXPACKET);
	bzero(mylovemostdata, IP_MAXPACKET);
	printf("Input some text, press enter and ctrl+d\n");
	// horrible code
	while ((ch = fgetc(stdin)) != EOF && (datalen < IP_MAXPACKET)) {
		mylovemostdata[datalen] = (unsigned char) ch;
		datalen++;
	}
	gettimeofday(&stats_before, NULL);
	epinfo = res;
	while(epinfo) {
		err = connect(sockfd, res->ei_endpoint, res->ei_endpointlen);
		if (err) {
			perror("connect");
			goto out;
		}
		epinfo = epinfo->ei_next;
	}
	gettimeofday(&stats_after, NULL);
	stats_diff_sec = (stats_after.tv_sec - stats_before.tv_sec) * 1000000;
	stats_diff_usec = stats_after.tv_usec - stats_before.tv_usec;
	printf("connect took %.10f sec\n",
	(stats_diff_sec + stats_diff_usec) / 1000000.0);
	
	/* Send the data read from stdin to the server and read the response.
	The server should echo all the data received back to here. */
	while((datasent < datalen) || (datareceived < datalen)) {
		if (datasent < datalen) {
			sendnum = send(sockfd, mylovemostdata + datasent, datalen - datasent, 0);
			if (sendnum < 0) {
				perror("send");
				err = 1;
				goto out;
			}
			datasent += sendnum;
		}
		if (datareceived < datalen) {
			recvnum = recv(sockfd, receiveddata + datareceived,
			datalen-datareceived, 0);
			if (recvnum <= 0) {
				perror("recv");
				err = 1;
				goto out;
			}
			datareceived += recvnum;
		}
	}
	
	if (memcmp(mylovemostdata, receiveddata, IP_MAXPACKET)) {
		printf("Sent and received data did not match\n");
		err = 1;
		goto out;
	}
	
	out:
	if (sockfd)
		close(sockfd); // discard errors
	if (res)
		free_endpointinfo(res);
	if (my_ed)
		free(my_ed);
	
	printf("Result of data transfer: %s.\n", (err ? "FAIL" : "OK"));
	return err;
}