tcp-chat/src/network/endpoint.c

60 lines
1.8 KiB
C
Executable File

#include "internal.h"
#include "endpoint.h"
struct sockaddr_in EndpointIPv4_toSockaddr(EndpointIPv4 end){
struct sockaddr_in saddr = {0};
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = end.address.UintBigEndian;
/* transforms port number to big endian (network order) */
saddr.sin_port = htons(end.port);
return saddr;
}
EndpointIPv4 EndpointIPv4_fromSockaddr(struct sockaddr_in saddr){
EndpointIPv4 end;
end.address = AddressIPv4_fromU32(saddr.sin_addr.s_addr);
/* transforms port number to little endian (normal order) */
end.port = ntohs(saddr.sin_port);
return end;
}
Result(void) AddressIPv4_parse(cstr s, AddressIPv4* addr){
*addr = AddressIPv4_INVALID;
u32 a, b, c, d;
if(sscanf(s, "%u.%u.%u.%u", &a, &b, &c, &d) != 4){
return RESULT_ERROR_FMT("can't parse as AddressIPv4: '%s'", s);
}
*addr = AddressIPv4_fromBytes(a, b, c, d);
return RESULT_VOID;
}
Result(void) EndpointIPv4_parse(cstr s, EndpointIPv4* end){
*end = EndpointIPv4_INVALID;
u32 a, b, c, d, p;
if(sscanf(s, "%u.%u.%u.%u:%u", &a, &b, &c, &d, &p) != 5){
return RESULT_ERROR_FMT("can't parse as EndpointIPv4: '%s'", s);
}
*end = EndpointIPv4_create(AddressIPv4_fromBytes(a, b, c, d), p);
return RESULT_VOID;
}
str AddressIPv4_toStr(AddressIPv4 addr){
char* data = malloc(16);
memset(data, 0, 16);
sprintf(data, "%u.%u.%u.%u",
addr.bytes[0], addr.bytes[1],
addr.bytes[2], addr.bytes[3]);
return str_from_cstr(data);
}
str EndpointIPv4_toStr(EndpointIPv4 end){
char* data = malloc(24);
memset(data, 0, 24);
sprintf(data, "%u.%u.%u.%u:%u",
end.address.bytes[0], end.address.bytes[1],
end.address.bytes[2], end.address.bytes[3],
end.port);
return str_from_cstr(data);
}