Browse Source

IPv6 support

1.0.0
Georg Hopp 12 years ago
parent
commit
3a35cf50ce
  1. 8
      include/tr/remote_data.h
  2. 68
      include/tr/socket.h
  3. 9
      src/remote_data.c
  4. 5
      src/remote_data_set_data.c
  5. 18
      src/socket.c
  6. 6
      src/socket_accept.c
  7. 11
      src/socket_init.c
  8. 1
      src/tcp_socket.c
  9. 5
      src/udp_socket.c

8
include/tr/remote_data.h

@ -30,12 +30,12 @@
#include <netdb.h>
#include "trbase.h"
#include "tr/socket.h"
TR_CLASS(TR_RemoteData) {
unsigned char * data;
size_t ndata;
struct sockaddr_in addr; // for now... should be more generic
socklen_t addrlen;
unsigned char * data;
size_t ndata;
TR_Socket socket;
};
TR_INSTANCE_INIT(TR_RemoteData);

68
include/tr/socket.h

@ -34,7 +34,7 @@
//#include <arpa/inet.h> // for in_port_t
#include "trbase.h"
#include "tr/interface/socket.h"
//#include "tr/interface/socket.h"
#include "tr/logger.h"
typedef enum TR_e_socket_fin {
@ -44,18 +44,25 @@ typedef enum TR_e_socket_fin {
TR_FIN_RDWR = 3
} TR_SocketFin;
#define TR_MAX_HOST 256
#define TR_MAX_CNAME 512
TR_CLASS(TR_Socket) {
TR_Logger log;
int flags;
int type;
char * host;
char * cname;
int port;
time_t ttl;
struct sockaddr_in addr; // for now... should be more generic.
socklen_t addrlen;
int handle;
TR_SocketFin fin_state;
TR_Logger log;
int flags;
int type;
char host[TR_MAX_HOST];
char cname[TR_MAX_CNAME];
int port;
time_t ttl;
union {
struct sockaddr info;
struct sockaddr_in in;
struct sockaddr_in6 in6;
} addr;
socklen_t addrlen;
int handle;
TR_SocketFin fin_state;
};
TR_INSTANCE_INIT(TR_Socket);
@ -67,7 +74,14 @@ TR_INSTANCE_INIT(TR_Socket);
#define TR_socketPort(socket) (((TR_Socket)(socket))->port)
#define TR_socketCname(socket) (((TR_Socket)(socket))->cname)
#define TR_socketTtl(socket) (((TR_Socket)(socket))->ttl)
#define TR_socketAddr(socket) (((TR_Socket)(socket))->addr)
#define TR_socketAddr(socket) \
(((TR_Socket)(socket))->addr.info.sa_family == AF_INET \
? ((TR_Socket)(socket))->addr.in \
: ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \
? ((TR_Socket)(socket))->addr.in6 \
: NULL)
#define TR_socketAddrlen(socket) (((TR_Socket)(socket))->addrlen)
#define TR_socketHandle(socket) (((TR_Socket)(socket))->handle)
#define TR_socketFinState(socket) (((TR_Socket)(socket))->fin_state)
@ -75,8 +89,32 @@ TR_INSTANCE_INIT(TR_Socket);
#define TR_socketFinWr(socket) ((TR_socketFinState((socket)) & 2) == 2)
#define TR_socketFinRdWr(socket) ((TR_socketFinState((socket)) & 3) == 3)
#define TR_socketGetIp(socket) (TR_socketAddr(socket).sin_addr.s_addr)
#define TR_socketGetIpStr(socket) (inet_ntoa(TR_socketGetIp(socket)))
#define TR_socketAddrPort(socket) \
(((TR_Socket)(socket))->addr.info.sa_family == AF_INET \
? ((TR_Socket)(socket))->addr.in.sin_port \
: ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \
? ((TR_Socket)(socket))->addr.in6.sin6_port \
: -1)
#define TR_socketAddrIp(socket) \
(((TR_Socket)(socket))->addr.info.sa_family == AF_INET \
? ((TR_Socket)(socket))->addr.in.sin_addr.s_addr \
: ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \
? ((TR_Socket)(socket))->addr.in6.sin6_addr.s6_addr \
: NULL)
#define TR_socketAddrIpStr(socket, buffer, nbuffer) \
(((TR_Socket)(socket))->addr.info.sa_family == AF_INET \
? inet_ntop( \
((TR_Socket)(socket))->addr.info.sa_family, \
&((TR_Socket)(socket))->addr.in.sin_addr.s_addr, \
buffer, nbuffer) \
: ((TR_Socket)(socket))->addr.info.sa_family == AF_INET6 \
? inet_ntop( \
((TR_Socket)(socket))->addr.info.sa_family, \
((TR_Socket)(socket))->addr.in6.sin6_addr.s6_addr, \
buffer, nbuffer) \
: NULL)
TR_CLASS(TR_TcpSocket) {
TR_EXTENDS(TR_Socket);

9
src/remote_data.c

@ -30,18 +30,17 @@
#include <sys/socket.h>
#include <netdb.h>
#include "tr/remote_data.h"
#include "trbase.h"
#include "tr/remote_data.h"
#include "tr/socket.h"
static
int
remoteDataCtor(void * _this, va_list * params)
{
TR_RemoteData this = _this;
struct sockaddr * addr_ptr = va_arg(*params, struct sockaddr *);
TR_RemoteData this = _this;
this->addrlen = va_arg(*params, socklen_t);
memcpy(&(this->addr), addr_ptr, this->addrlen);
this->socket = va_arg(*params, TR_Socket);
this->data = NULL;
this->ndata = 0;

5
src/remote_data_set_data.c

@ -35,7 +35,10 @@ TR_remoteDataSetData(TR_RemoteData this, unsigned char * data, size_t size)
TR_MEM_FREE(this->data);
}
this->data = TR_malloc(size);
if (! this->data) {
this->data = TR_malloc(size);
}
this->ndata = size;
memcpy(this->data, data, size);
}

18
src/socket.c

@ -25,6 +25,7 @@
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
@ -32,6 +33,7 @@
#include "tr/remote_data.h"
#include "tr/socket.h"
#include "tr/interface/socket.h"
#include "tr/logger.h"
#include "trbase.h"
@ -39,16 +41,21 @@ static
int
socketCtor(void * _this, va_list * params)
{
TR_Socket this = _this;
TR_Socket this = _this;
char * host;
this->type = 0;
this->type = AF_UNSPEC;
this->handle = -1;
this->log = va_arg(*params, TR_Logger);
this->host = TR_strdup(va_arg(*params, char*));
host = va_arg(*params, char*);
this->port = va_arg(*params, int);
this->flags = va_arg(*params, int);
this->fin_state = TR_FIN_RDWR;
if (host) {
strncpy(this->host, host, TR_MAX_HOST);
}
return 0;
}
@ -58,9 +65,6 @@ socketDtor(void * _this)
{
TR_Socket this = _this;
TR_MEM_FREE(this->host);
TR_MEM_FREE(this->cname);
if (STDERR_FILENO < this->handle) {
TR_socketClose(this);
}
@ -73,7 +77,7 @@ socketBind(void * _this)
TR_Socket this = _this;
int state;
state = bind(this->handle, (struct sockaddr *)&(this->addr), this->addrlen);
state = bind(this->handle, &(this->addr.info), this->addrlen);
if (-1 == state) {
perror("bind");

6
src/socket_accept.c

@ -46,7 +46,7 @@ TR_socketAccept(TR_TcpSocket this)
remote->addrlen = ((TR_Socket)this)->addrlen;
remote->handle = accept(
TR_socketHandle(this),
(struct sockaddr *)&(remote->addr),
&(remote->addr.info),
&(remote->addrlen));
//flags = fcntl(remote->handle, F_GETFL, 0);
@ -56,8 +56,8 @@ TR_socketAccept(TR_TcpSocket this)
perror("accept");
TR_delete(remote);
} else {
remote->host = TR_strdup(inet_ntoa(remote->addr.sin_addr));
remote->port = ntohs(remote->addr.sin_port);
TR_socketAddrIpStr(remote, remote->host, TR_MAX_HOST);
remote->port = TR_socketAddrPort(remote);
remote->type = TR_socketType(this);
remote->flags = TR_socketFlags(this);
}

11
src/socket_init.c

@ -27,6 +27,7 @@
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
@ -41,6 +42,7 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action)
struct addrinfo hint;
struct addrinfo * info, * current_info;
char port_str[6];
int code;
hint.ai_socktype = this->type;
hint.ai_flags = this->flags;
@ -52,8 +54,11 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action)
hint.ai_next = NULL;
sprintf(port_str, "%u", this->port);
if (0 != getaddrinfo(this->host, port_str, &hint, &info)) {
code = getaddrinfo(this->host, port_str, &hint, &info);
if (0 != code) {
// TODO error handling...
puts(gai_strerror(code));
return FALSE;
}
@ -88,7 +93,9 @@ TR_socketInit(TR_Socket this, TR_socketAction_fptr action)
//int flags = fcntl(this->handle, F_GETFL, 0);
//fcntl(this->handle, F_SETFL, flags | O_NONBLOCK);
this->cname = TR_strdup(current_info->ai_canonname);
if (current_info->ai_canonname) {
strncpy(this->cname, current_info->ai_canonname, TR_MAX_CNAME);
}
this->fin_state = TR_FIN_NO;
//! Make the socket REUSE a TIME_WAIT socket

1
src/tcp_socket.c

@ -30,6 +30,7 @@
#include <netdb.h>
#include "tr/socket.h"
#include "tr/interface/socket.h"
#include "tr/logger.h"
#include "trbase.h"

5
src/udp_socket.c

@ -30,6 +30,7 @@
#include <netdb.h>
#include "tr/socket.h"
#include "tr/interface/socket.h"
#include "tr/logger.h"
#include "trbase.h"
@ -85,8 +86,8 @@ udpSocketSend(TR_Socket this, TR_RemoteData data)
data->data,
data->ndata,
this->flags,
(struct sockaddr *)&(data->addr),
data->addrlen);
&(data->socket->addr.info),
data->socket->addrlen);
if (-1 == send) {
perror("sendto");

Loading…
Cancel
Save