14 #include <netinet/in.h>
16 #include <sys/socket.h>
17 #include <sys/ioctl.h>
23 #include <sys/filio.h>
29 struct sockaddr_in serv_addr;
42 struct sockaddr_in cl_addr;
44 struct hostent *hostsEntry;
47 o = (desc *)malloc(
sizeof(desc));
48 if (o == NULL)
return NULL;
50 o->len =
sizeof(cl_addr);
51 lives_memset((
char *)&o->serv_addr, 0,
sizeof(o->serv_addr));
52 o->serv_addr.sin_family = AF_INET;
54 if (strcmp(host,
"INADDR_ANY")) {
55 hostsEntry = gethostbyname(host);
57 if (hostsEntry == NULL) {
62 address = *((uint64_t *) hostsEntry->h_addr_list[0]);
67 o->serv_addr.sin_addr.s_addr = address;
68 o->serv_addr.sin_port = htons(portnumber);
71 if (!strcmp(host,
"INADDR_ANY")) o->serv_addr.sin_addr.s_addr = INADDR_ANY;
72 else o->serv_addr.sin_addr.s_addr = address;
73 o->serv_addr.sin_port = htons(0);
77 o->addr = (sockaddr *) & (o->serv_addr);
79 o->addr = &(o->serv_addr);
82 if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
84 cl_addr.sin_family = AF_INET;
87 cl_addr.sin_addr.s_addr = INADDR_ANY;
88 cl_addr.sin_port = htons(0);
91 cl_addr.sin_addr.s_addr = INADDR_ANY;
92 cl_addr.sin_port = htons(portnumber);
94 if (bind(sockfd, (
struct sockaddr *) &cl_addr,
sizeof(cl_addr)) < 0) {
95 lives_printerr(
"could not bind\n");
99 }
else lives_printerr(
"unable to make socket\n");
105 int mxsize = 1024 * 1024;
107 if (!sender) setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (
void *) &mxsize,
sizeof(mxsize));
110 if (o != NULL && strcmp(host,
"INADDR_ANY")) {
111 connect(sockfd, o->addr,
sizeof(cl_addr));
118 static ssize_t getudp(
struct sockaddr *sp,
int sockfd,
int length,
size_t count,
void *b,
int bfsize) {
125 socklen_t slt =
sizeof(xbfsize);
126 setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (
void *) &bfsize,
sizeof(bfsize));
127 getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, (
void *) &xbfsize, &slt);
128 if (xbfsize < bfsize)
return -2;
132 ioctlsocket(sockfd, FIONREAD, &len);
134 ioctl(sockfd, FIONREAD, &len);
137 if (len == 0)
return -1;
140 res = recvfrom(sockfd, b, count, flags, sp, (socklen_t *)&length);
148 static boolean sendudp(
const struct sockaddr *sp,
int sockfd,
int length,
size_t count,
void *b) {
150 if ((rcount = sendto(sockfd, b, count, 0, sp, length)) != count) {
159 desc *o = (desc *)(htmsendhandle);
160 return sendudp(o->addr, o->sockfd, o->len, length, buffer);
163 ssize_t
lives_stream_in(
void *htmrecvhandle,
size_t length,
void *buffer,
int bfsize) {
164 desc *o = (desc *)htmrecvhandle;
166 return getudp((sockaddr *)o->addr, o->sockfd, o->len, length, buffer, bfsize);
168 return getudp(o->addr, o->sockfd, o->len, length, buffer, bfsize);
174 desc *o = (desc *)htmsendhandle;