Compare commits
17 Commits
ddb1b16c93
...
master
Author | SHA1 | Date | |
---|---|---|---|
5df38a4e97 | |||
862fb9f944 | |||
8c05336c73 | |||
94e9ba3b57 | |||
ad0966f749 | |||
07e991223f | |||
14418078ff | |||
19281f8ca3 | |||
b8a9f77e13 | |||
643c8abb67 | |||
424e95c603 | |||
b64268f323 | |||
bb00c52479 | |||
32f9974c19 | |||
1c63ea60c2 | |||
9d164cf7b8 | |||
9c94eb001b |
5
Makefile
5
Makefile
@@ -40,9 +40,11 @@ install: $(LIB_FILE)
|
||||
install -d $(DESTDIR)$(PREFIX)/include
|
||||
install -m 644 easysock.h $(DESTDIR)$(PREFIX)/include
|
||||
|
||||
install -m 644 docs/man3/*.gz /usr/share/man/man3/
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm *.o
|
||||
rm easysock.o
|
||||
rm $(LIB_FILE)
|
||||
|
||||
|
||||
@@ -50,3 +52,4 @@ clean:
|
||||
uninstall:
|
||||
rm $(DESTDIR)$(PREFIX)/lib/$(LIB_FILE)
|
||||
rm $(DESTDIR)$(PREFIX)/include/easysock.h
|
||||
|
||||
|
11
README.md
11
README.md
@@ -1,4 +1,3 @@
|
||||
# Easysock
|
||||
## An easy-to-use C socket library
|
||||
|
||||
*Easysock* is a single-file, easy-to-use socket library, that can be used for network programming in C. It has no dependencies other than the C standard library.
|
||||
@@ -16,7 +15,6 @@ There are a few optional targets, which enable specific functionality.
|
||||
`debug - compile with 'debug' flag`
|
||||
`static - compile as statically linked library - NOT IMPLEMENTED`
|
||||
|
||||
<br />
|
||||
<br />
|
||||
|
||||
They can be used as follows:
|
||||
@@ -28,7 +26,7 @@ The library can also be installed using the provided Mekfile.
|
||||
```
|
||||
make install
|
||||
```
|
||||
The `install` target supports two environment variables. `DESTDIR`, which specifies the installation directory, and `PREFIX` which specifies the installation prefix. They are used as follows:
|
||||
The `install` target supports two environment variables. `DESTDIR`, which specifies the installation directory, and `PREFIX` which specifies the installation prefix. They can be used as follows:
|
||||
|
||||
`DESTDIR=/home/user PREFIX=/usr/local make install`
|
||||
|
||||
@@ -43,5 +41,12 @@ To use the library, simply include the header file:
|
||||
and link the library:
|
||||
`gcc example.c -o example -leasysock`
|
||||
___
|
||||
### Troubleshooting
|
||||
#### The library isn't loaded on Arch Linux, "cannot open shared object file: No such file or directory"
|
||||
This is becacuse Arch Linux [doesn't include '/usr/local/lib'](https://libreddit.tiekoetter.com/r/archlinux/comments/ws9qty/why_is_usrlocallib_not_in_the_default_search_path/) in its library search path by default. To add it, create a file ending in '.conf' under `/etc/ld.so.conf.d/`, and add '/usr/local/lib' to it. Then, run `ldconfig` as root.
|
||||
|
||||
<br />
|
||||
<br />
|
||||
|
||||
This file was written using [Dillinger](https://dillinger.io).
|
||||
|
||||
|
BIN
docs/man3/char_to_socktype.3.gz
Normal file
BIN
docs/man3/char_to_socktype.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/check_ip_ver.3.gz
Normal file
BIN
docs/man3/check_ip_ver.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/create_addr.3.gz
Normal file
BIN
docs/man3/create_addr.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/create_local.3.gz
Normal file
BIN
docs/man3/create_local.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/create_remote.3.gz
Normal file
BIN
docs/man3/create_remote.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/create_socket.3.gz
Normal file
BIN
docs/man3/create_socket.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/easysock.3.gz
Normal file
BIN
docs/man3/easysock.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/inet_to_int.3.gz
Normal file
BIN
docs/man3/inet_to_int.3.gz
Normal file
Binary file not shown.
BIN
docs/man3/int_to_inet.3.gz
Normal file
BIN
docs/man3/int_to_inet.3.gz
Normal file
Binary file not shown.
29
easysock.c
29
easysock.c
@@ -1,5 +1,6 @@
|
||||
#include "easysock.h"
|
||||
|
||||
|
||||
int create_socket(int network, char transport) {
|
||||
int domain;
|
||||
int type;
|
||||
@@ -25,7 +26,7 @@ int create_socket(int network, char transport) {
|
||||
}
|
||||
|
||||
|
||||
void create_addr(int network, char* address, int port,struct sockaddr* dest) {
|
||||
int create_addr(int network, char* address, int port,struct sockaddr* dest) {
|
||||
if (network == 4) {
|
||||
struct sockaddr_in listen_address;
|
||||
|
||||
@@ -33,7 +34,7 @@ void create_addr(int network, char* address, int port,struct sockaddr* dest) {
|
||||
listen_address.sin_port = htons(port);
|
||||
inet_pton(AF_INET,address,&listen_address.sin_addr);
|
||||
memcpy(dest,&listen_address,sizeof(listen_address));
|
||||
return;
|
||||
return 0;
|
||||
|
||||
} else if (network == 6) {
|
||||
struct sockaddr_in6 listen_ipv6;
|
||||
@@ -41,10 +42,10 @@ void create_addr(int network, char* address, int port,struct sockaddr* dest) {
|
||||
listen_ipv6.sin6_port = htons(port);
|
||||
inet_pton(AF_INET6,address,&listen_ipv6.sin6_addr);
|
||||
memcpy(dest,&listen_ipv6,sizeof(listen_ipv6));
|
||||
return;
|
||||
return 0;
|
||||
|
||||
} else {
|
||||
exit(202);
|
||||
return -202;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -52,7 +53,7 @@ void create_addr(int network, char* address, int port,struct sockaddr* dest) {
|
||||
int create_local (int network, char transport, char* address, int port,struct sockaddr* addr_struct) {
|
||||
int socket = create_socket(network,transport);
|
||||
if (socket < 0) {
|
||||
exit(errno);
|
||||
return (-1 * errno);
|
||||
}
|
||||
create_addr(network,address,port,addr_struct);
|
||||
int addrlen;
|
||||
@@ -61,7 +62,7 @@ int create_local (int network, char transport, char* address, int port,struct so
|
||||
} else if (network == 6) {
|
||||
addrlen = sizeof(struct sockaddr_in6);
|
||||
} else {
|
||||
exit(207);
|
||||
return -202;
|
||||
}
|
||||
|
||||
/* The value of addrlen should be the size of the 'sockaddr'.
|
||||
@@ -70,7 +71,7 @@ int create_local (int network, char transport, char* address, int port,struct so
|
||||
|
||||
int i = bind (socket,addr_struct,(socklen_t)addrlen);
|
||||
if (i < 0) {
|
||||
exit(errno);
|
||||
return (-1 * errno);
|
||||
}
|
||||
return socket;
|
||||
}
|
||||
@@ -93,7 +94,7 @@ int create_remote (int network,char transport,char* address,int port,struct sock
|
||||
|
||||
err_code = getaddrinfo(address,port_str,&hints,&results);
|
||||
if (err_code != 0) {
|
||||
exit(err_code);
|
||||
return (-1 * err_code);
|
||||
}
|
||||
remote_addr_struct = results->ai_addr;
|
||||
network = inet_to_int(results->ai_family);
|
||||
@@ -103,7 +104,7 @@ int create_remote (int network,char transport,char* address,int port,struct sock
|
||||
|
||||
int socket = create_socket(network,transport);
|
||||
if (socket < 0) {
|
||||
exit(errno);
|
||||
return (-1 * errno);
|
||||
}
|
||||
|
||||
int addrlen;
|
||||
@@ -112,7 +113,7 @@ int create_remote (int network,char transport,char* address,int port,struct sock
|
||||
} else if (network == 6) {
|
||||
addrlen = sizeof(struct sockaddr_in6);
|
||||
} else {
|
||||
exit(207);
|
||||
return (-202);
|
||||
}
|
||||
|
||||
/* The value of addrlen should be the size of the 'sockaddr'.
|
||||
@@ -121,7 +122,7 @@ int create_remote (int network,char transport,char* address,int port,struct sock
|
||||
|
||||
int i = connect(socket,remote_addr_struct,(socklen_t)addrlen);
|
||||
if (i < 0) {
|
||||
exit(errno);
|
||||
return (-1 * errno);
|
||||
}
|
||||
return socket;
|
||||
}
|
||||
@@ -144,7 +145,7 @@ int int_to_inet(int network) {
|
||||
} else if (network == 6) {
|
||||
return AF_INET6;
|
||||
} else {
|
||||
exit(207);
|
||||
return -202;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,7 +155,7 @@ int inet_to_int(int af_type) {
|
||||
} else if (af_type == AF_INET6) {
|
||||
return 6;
|
||||
} else {
|
||||
exit(207);
|
||||
return -207;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +165,6 @@ int char_to_socktype(char transport) {
|
||||
} else if (transport == 'U') {
|
||||
return SOCK_DGRAM;
|
||||
} else {
|
||||
exit(250);
|
||||
return -250;
|
||||
}
|
||||
}
|
||||
|
11
easysock.h
11
easysock.h
@@ -28,10 +28,10 @@ int create_socket(int network, char transport);
|
||||
port is self-explanatory;
|
||||
and dest is a pointer to the sockaddr struct that will be filled in.
|
||||
|
||||
The function exits with error code 202 if the network parameter contained neither '4'
|
||||
The function returns with -202 if the network parameter contained neither '4'
|
||||
nor '6'. */
|
||||
|
||||
void create_addr(int network, char* address, int port,struct sockaddr* dest);
|
||||
int create_addr(int network, char* address, int port,struct sockaddr* dest);
|
||||
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ void create_addr(int network, char* address, int port,struct sockaddr* dest);
|
||||
_binds_ the addresses. It is used for local sockets (server sockets). Parameters are
|
||||
same as above.
|
||||
|
||||
It prints the error returned by 'bind' if something went wrong, and exits with errno.*/
|
||||
It prints the error returned by 'bind' if something went wrong, and returns ( -1 * errno ).*/
|
||||
|
||||
int create_local (int network, char transport, char* address, int port,struct sockaddr* addr_struct);
|
||||
|
||||
@@ -48,7 +48,7 @@ int create_local (int network, char transport, char* address, int port,struct so
|
||||
requested address. It is used for remote sockets (client sockets). The paramters are same
|
||||
as above. This function needs an empty 'sockaddr *' structure passed to it, which it will fill.
|
||||
|
||||
It prints the error returned by 'connect' if something went wrong, and exits with errno.*/
|
||||
If something goes wrong, this function returns with ( -1 * errno ). */
|
||||
|
||||
int create_remote (int network,char transport,char* address,int port,struct sockaddr* remote_addr_struct);
|
||||
|
||||
@@ -63,7 +63,7 @@ AF_INET6 respectively. */
|
||||
int int_to_inet(int network);
|
||||
|
||||
/* char_to_socktype - Takes a character that represents a transport-layer protocol
|
||||
(currently only supports 'T' for TCP or 'U' for UDP - exits with error code 250 if
|
||||
(currently only supports 'T' for TCP or 'U' for UDP - it returns -250 if
|
||||
the given characters is neither of these) and return the appropriate SOCKTYPE value. */
|
||||
|
||||
int char_to_socktype(char transport);
|
||||
@@ -72,4 +72,5 @@ int char_to_socktype(char transport);
|
||||
and returns the appropriate int value. */
|
||||
int inet_to_int(int af_type);
|
||||
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user