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;
}