view 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
line wrap: on
line source

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>

int _internal_accept(int sockfd, char * addrbuf, int buflen)
{
	int retfd;
	socklen_t addr_size;
	struct sockaddr_storage remote_addr;
	addr_size = sizeof(remote_addr);
	retfd = accept(sockfd, (struct sockaddr *)&remote_addr, &addr_size);
	if (addrbuf && buflen)
	{
		addrbuf[0] = '\0';
		if(retfd == -1)
			return retfd;
		switch(remote_addr.ss_family)
		{
		case AF_INET:
			inet_ntop(AF_INET, &(((struct sockaddr_in *)&remote_addr)->sin_addr), addrbuf, buflen);
			break;
		case AF_INET6:
			inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)&remote_addr)->sin6_addr), addrbuf, buflen);
			break;
		}
	}
	return retfd;
}


int _internal_bindnewsocket(unsigned int port, int setreuse)
{
	char portstr[6];
	int sockfd,flag=1;
	struct addrinfo hints, *localaddr;
	
	snprintf(portstr, 6, "%d", port & 0XFFFF);
	
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE;
	
	getaddrinfo(NULL, portstr, &hints, &localaddr);
	
	sockfd = socket(localaddr->ai_family, localaddr->ai_socktype, localaddr->ai_protocol);
	if (sockfd == -1)
	{
		freeaddrinfo(localaddr);
		return sockfd;
	}
	if(setreuse)
		setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,&flag,sizeof(int));
	if(-1 == bind(sockfd, localaddr->ai_addr, localaddr->ai_addrlen))
	{
		close(sockfd);
		sockfd = -1;
	}
	freeaddrinfo(localaddr);
	return sockfd;
}