summaryrefslogtreecommitdiff
path: root/src/lib/dlt_client.c
diff options
context:
space:
mode:
authorJiri Popek <Jiri.Popek@bmw.de>2015-03-17 13:17:25 +0100
committerAlexander Wenzel <Alexander.AW.Wenzel@bmw.de>2015-03-23 14:41:26 +0100
commit9a70eef3ee739543b87c867fd5b643b703899c89 (patch)
treef0eb67ae73b6acc643881851c5f0625281cb6ede /src/lib/dlt_client.c
parentdb5b62a1c054667dc82929d90e195cd4a7060f4c (diff)
downloadDLT-daemon-9a70eef3ee739543b87c867fd5b643b703899c89.tar.gz
Add the IPv6 support
Enables communication between DLT server and clients over IPv6. Signed-off-by: Jiri Popek <jiri.popek@bmw.de> Signed-off-by: Alexander Wenzel <Alexander.AW.Wenzel@bmw.de>
Diffstat (limited to 'src/lib/dlt_client.c')
-rwxr-xr-xsrc/lib/dlt_client.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/src/lib/dlt_client.c b/src/lib/dlt_client.c
index b8872ad..d5f81e9 100755
--- a/src/lib/dlt_client.c
+++ b/src/lib/dlt_client.c
@@ -94,6 +94,8 @@
static int (*message_callback_function) (DltMessage *message, void *data) = NULL;
+static char str[DLT_CLIENT_TEXTBUFSIZE];
+
void dlt_client_register_message_callback(int (*registerd_callback) (DltMessage *message, void *data)){
message_callback_function = registerd_callback;
}
@@ -122,9 +124,12 @@ int dlt_client_init(DltClient *client, int verbose)
int dlt_client_connect(DltClient *client, int verbose)
{
- struct sockaddr_in servAddr;
- unsigned short servPort = DLT_DAEMON_TCP_PORT;
- struct hostent *host; /* Structure containing host information */
+ char portnumbuffer[33];
+ struct addrinfo hints, *servinfo, *p;
+ int rv;
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_socktype = SOCK_STREAM;
if (client==0)
{
@@ -133,27 +138,30 @@ int dlt_client_connect(DltClient *client, int verbose)
if (client->serial_mode==0)
{
- /* open socket */
- if ((client->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
- {
- fprintf(stderr,"ERROR: socket() failed!\n");
+ sprintf(portnumbuffer, "%d", DLT_DAEMON_TCP_PORT);
+ if ((rv = getaddrinfo(client->servIP, portnumbuffer, &hints, &servinfo)) != 0) {
+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
return -1;
}
- if ((host = (struct hostent*) gethostbyname(client->servIP)) == 0)
- {
- fprintf(stderr, "ERROR: gethostbyname() failed\n");
- return -1;
+ for(p = servinfo; p != NULL; p = p->ai_next) {
+ if ((client->sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) < 0) {
+ snprintf(str, DLT_CLIENT_TEXTBUFSIZE, "socket() failed!\n");
+ continue;
+ }
+ if (connect(client->sock, p->ai_addr, p->ai_addrlen) < 0) {
+ close(client->sock);
+ snprintf(str, DLT_CLIENT_TEXTBUFSIZE, "connect() failed!\n");
+ continue;
+ }
+
+ break;
}
- memset(&servAddr, 0, sizeof(servAddr));
- servAddr.sin_family = AF_INET;
- servAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*( struct in_addr*)( host -> h_addr_list[0])));
- servAddr.sin_port = htons(servPort);
+ freeaddrinfo(servinfo);
- if (connect(client->sock, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
- {
- fprintf(stderr,"ERROR: connect() failed!\n");
+ if (p == NULL) {
+ fprintf(stderr, "ERROR: failed to connect - %s\n", str);
return -1;
}
@@ -201,6 +209,7 @@ int dlt_client_connect(DltClient *client, int verbose)
if (dlt_receiver_init(&(client->receiver),client->sock,DLT_CLIENT_RCVBUFSIZE)!=0)
{
+ fprintf(stderr, "ERROR initializing receiver\n");
return -1;
}