-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathsocklib.h
More file actions
133 lines (103 loc) · 3.73 KB
/
Copy pathsocklib.h
File metadata and controls
133 lines (103 loc) · 3.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* A simple server in the internet domain using TCP
The port number is passed as an argument */
#ifndef SOCKLIB_H
#define SOCKLIB_H
#include <stdlib.h>
#include <string.h>
// Note to self: research these ->
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
static int sl_socket_error = 0;
static int sl_bind_error = 0;
static int sl_listen_error = 0;
int sl_set_boolean_option(int sock, int option, int value){return setsockopt(sock, SOL_SOCKET, option, &value, sizeof(value));}
int sl_set_reuseaddr(int sock, int v) {return sl_set_boolean_option(sock, SO_REUSEADDR, v);}
int sl_set_broadcast(int sock, int v) {return sl_set_boolean_option(sock, SO_BROADCAST, v);}
int sl_set_keepalive(int sock, int v) {return sl_set_boolean_option(sock, SO_KEEPALIVE, v);}
int sl_set_debug(int sock, int v) {return sl_set_boolean_option(sock, SO_DEBUG, v);}
int sl_set_oobinline(int sock, int v) {return sl_set_boolean_option(sock, SO_OOBINLINE, v);}
int sl_tcp(){
return socket(AF_INET, SOCK_STREAM, 0);
}
int sl_udp(){
return socket(AF_INET, SOCK_DGRAM, 0);
}
// create and return a pointer to a standard configured sockaddr
// (uses internet, accepts from any interface, uses given port).
struct sockaddr *sl_sockaddr_server(int port){
struct sockaddr_in *adr = malloc(sizeof(struct sockaddr_in));
bzero(adr, sizeof(*adr)); // initialize serv_addr (set bytes to zero)
adr->sin_family = AF_INET; // set domain to internet
adr->sin_addr.s_addr = INADDR_ANY; // accept connections on ANY interface (specified as an IP address)
adr->sin_port = htons(port); // htons is required to convert port bytes to 'network order'
return (struct sockaddr *) adr; // Return as a sockaddr (flattened version of sockaddr_in essentially)
}
struct sockaddr *sl_sockaddr(){
struct sockaddr *s;
s = malloc(sizeof(struct sockaddr));
bzero(s, sizeof(*s));
return s;
}
// Binds a tcp server.
int sl_tcp_server(struct sockaddr *serv_addr){
int sock;
sock = socket(AF_INET, SOCK_STREAM, 0); // Create a socket (Internet, Stream, (TCP))
if(sock<0){
sl_socket_error = sock;
return -1;
}
sl_set_reuseaddr(sock, 1); // set a flag to so it doesn't clog up the port
int bind_result;
bind_result = bind(sock, serv_addr, sizeof(*serv_addr));
// Bind the address to the socket (Fails if port is already being used)
if (bind_result < 0){
sl_bind_error = bind_result;
return -1;
}
// Mark the socket to accept incoming connections.
int listen_result = listen(sock, SOCK_STREAM);
if(listen_result < 0){
sl_listen_error = listen_result;
return -1;
}
return sock;
}
int sl_udp_server(int port){
int sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock<0){
sl_socket_error = sock;
return -1;
}
sl_set_reuseaddr(sock, 1); // set a flag to so it doesn't clog up the port
struct sockaddr serv_addr = *sl_sockaddr(port); // Create an address for our listener socket
int bind_result;
bind_result = bind(sock, &serv_addr, sizeof(serv_addr));
// Bind the address to the socket (Fails if port is already being used)
if (bind_result < 0){
sl_bind_error = bind_result;
return -1;
}
return sock;
}
// returns a socket file identifier (int) of a connected client.
// (Warning, you lose all the client address information by using this)
// You know, if you wanted that.
int sl_accept(int sock, struct sockaddr *client_address){
socklen_t client_address_length = sizeof(*client_address);
bzero(client_address,client_address_length);
return accept(sock, client_address, &client_address_length);;
}
// read (bsize) bytes from socket (sockfd)
char *sl_read(int sock, unsigned int bsize){
int buffer_size = bsize;
char *buf = malloc(buffer_size);
bzero(buf, buffer_size);
if(read(sock, buf, buffer_size) < 0){
return NULL;
}
return buf;
}
#endif