comparison runtime/net.c @ 142:7bbdc034e347

Fix some bugs. Get basic network code working (epoll listener + accept connections). Start porting webserver.
author Mike Pavone <pavone@retrodev.com>
date Sun, 21 Nov 2010 16:33:17 -0500
parents
children e9a8269384bb
comparison
equal deleted inserted replaced
141:f2cb85c53ced 142:7bbdc034e347
1 #include <sys/types.h>
2 #include <sys/socket.h>
3 #include <netdb.h>
4 #include <netinet/in.h>
5 #include <string.h>
6 #include <stdio.h>
7
8 int _internal_accept(int sockfd, char * addrbuf, int buflen)
9 {
10 int retfd;
11 socklen_t addr_size;
12 struct sockaddr_storage remote_addr;
13 addr_size = sizeof(remote_addr);
14 retfd = accept(sockfd, (struct sockaddr *)&remote_addr, &addr_size);
15 if (addrbuf && buflen)
16 {
17 addrbuf[0] = '\0';
18 if(retfd == -1)
19 return retfd;
20 switch(remote_addr.ss_family)
21 {
22 case AF_INET:
23 inet_ntop(AF_INET, &(((struct sockaddr_in *)&remote_addr)->sin_addr), addrbuf, buflen);
24 break;
25 case AF_INET6:
26 inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)&remote_addr)->sin6_addr), addrbuf, buflen);
27 break;
28 }
29 }
30 return retfd;
31 }
32
33
34 int _internal_bindnewsocket(unsigned int port, int setreuse)
35 {
36 char portstr[6];
37 int sockfd,flag=1;
38 struct addrinfo hints, *localaddr;
39
40 snprintf(portstr, 6, "%d", port & 0XFFFF);
41
42 memset(&hints, 0, sizeof(hints));
43 hints.ai_family = AF_UNSPEC;
44 hints.ai_socktype = SOCK_STREAM;
45 hints.ai_flags = AI_PASSIVE;
46
47 getaddrinfo(NULL, portstr, &hints, &localaddr);
48
49 sockfd = socket(localaddr->ai_family, localaddr->ai_socktype, localaddr->ai_protocol);
50 if (sockfd == -1)
51 {
52 freeaddrinfo(localaddr);
53 return sockfd;
54 }
55 if(setreuse)
56 setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,&flag,sizeof(int));
57 if(-1 == bind(sockfd, localaddr->ai_addr, localaddr->ai_addrlen))
58 {
59 close(sockfd);
60 sockfd = -1;
61 }
62 freeaddrinfo(localaddr);
63 return sockfd;
64 }
65