Mercurial > repos > rhope
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 |