All pastes #964878 Raw Edit

Stuff

public text v1 · immutable
#964878 ·published 2008-03-31 16:54 UTC
rendered paste body
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
#include <sys/file.h>

int main(int argc, char *argv[])
{
	struct sockaddr_in addr;
	int fd, newFd, ret, fileFd, size = sizeof(addr);
	char buf[1024];
	
	if(argc < 2)
	{
	 	fprintf(stderr, "uso: %s <upload_file>\n", argv[0]);
	 	exit(EXIT_FAILURE);
	}
	
	/**
	 * AF_INET: dominio de la red
	 * SOCK_STREAM: orientado a conexión
	 */
	 fd = socket(AF_INET, SOCK_STREAM, 0);
	 if(fd == -1) {
	 	perror("socket");
	 	exit(EXIT_FAILURE);
	 }
	 
	 addr.sin_family = AF_INET;
	 addr.sin_port = htons(9000); /* 1 a 65535... pero 1 al 1024 solo para root */
	 addr.sin_addr.s_addr = INADDR_ANY; /* cualquier direc que tenga del servidor */
	 
	if(bind(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
		perror("bind");
	 	exit(EXIT_FAILURE);
	}
	
	if(listen(fd,10) == -1) {
		perror("listen");
	 	exit(EXIT_FAILURE);
	}
	
	while(1)
	{
		if((newFd = accept(fd, (struct sockaddr *)&addr, &size)) == -1)
		{
			perror("listen");
			exit(EXIT_FAILURE);
		}
		
		if((fileFd = open(argv[1], O_RDONLY)) < 0)
		{
			fprintf(stderr, "error abriendo el fichero origen: %s", argv[1]);
			exit(EXIT_FAILURE);
		}
		
		while( (ret=read(fileFd,buf,sizeof(buf))) > 0)
		{
			if( send(newFd, buf, ret, 0) == -1)
			{
				perror("send");
				exit(EXIT_FAILURE);
			}
		}
		
		close(fileFd);
		close(newFd);
	}
	
	return 0;
}