Bueno dejando mi aporte. El otro día pedí ayuda para terminar este programa...
Es un código en C#, para la utilización de Sockets UNIX.
En sintesis son 2 Codigos, uno para el Cliente y otro Para el servidor.
El Cliente despliega un menu para elejir la cantidad de bytes a recivir.
El Servidor recibe la peticion y luego responde con la cantidad de bytes
.
Encontraran 2 Funciones, sendall() y recvall() que se encargan de enviar los datos que superen la MTU en fragmentos, y la otra recibirá los datos en fragmentos y los juntara.
Conste que era un tareita que tenia y se las dejo, por si alguien llegase a tener las dudas porque yo no encontre la solucion en internet D:, solo Google me ayudo a entender xD...
Código Cliente:
Es un código en C#, para la utilización de Sockets UNIX.
En sintesis son 2 Codigos, uno para el Cliente y otro Para el servidor.
El Cliente despliega un menu para elejir la cantidad de bytes a recivir.
El Servidor recibe la peticion y luego responde con la cantidad de bytes
.Encontraran 2 Funciones, sendall() y recvall() que se encargan de enviar los datos que superen la MTU en fragmentos, y la otra recibirá los datos en fragmentos y los juntara.
Conste que era un tareita que tenia y se las dejo, por si alguien llegase a tener las dudas porque yo no encontre la solucion en internet D:, solo Google me ayudo a entender xD...
Código Cliente:
Código:
/*
** Cliente TCP
*/
// Librerias a usar
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 4000 // Puerto al que se va a conectar, es una constante... Se puede cambiar (Deben ser = en Cliente y Server)
#define MAXDATASIZE 10241 // Máximo número de bytes que se pueden leer de una vez, se debe cambiar, para cambiar el tamaño
//Funciona que permite Recibir todos los datos
int recvall(int sockfd, char *buf, int *len)
{
int total = 0; // cuántos bytes hemos recivido
int bytesleft = *len; // cuántos se han quedado pendientes
int n; // es nuestro buffer de la funcion
while(*len > total) // preguntamos si la longitud total del paquete es mayor a la tolta (inicializada en 0)
{
n = recv(sockfd, buf+total, bytesleft, 0);
if (n == -1) { break; } // si no se reciben datos, se quiebra el while y envia error
total += n; //aumentamos el total a la cantidad ya recibida
bytesleft -= n; // a lo qe qeda por recibir le quitamos la cantidad recibida
}
return(total);
}
int main(int argc, char *argv[])
{
int sockfd, numbytes; // SOCKFD es una variable SOCKET, NUMBYTES es el numero de bytes recibidos desde el server
char buf[MAXDATASIZE]; // BUFF es una variable BUFFER que recibe el texto...
char op[255];
int len;
struct hostent *he;
struct sockaddr_in direc; // DIREC es un socket de la direccion internet de destino
printf("1. Enviar 1 byten");
printf("2. Enviar 8 bytesn");
printf("3. Enviar 16 bytesn");
printf("4. Enviar 64 bytesn");
printf("5. Enviar 128 bytesn");
printf("6. Enviar 512 bytesn");
printf("7. Enviar 1 Kbyten");
printf("8. Enviar 2 Kbytesn");
printf("9. Enviar 10 Kbytesn");
printf("Ingrese la Opcion: ");
scanf("%s",&op);
if (argc != 2)
{
fprintf (stderr, "USO: tcpc <ip_servidor>n"); //Falta la IP del server, sale e indica error
exit (1);
}
if ( (he=gethostbyname(argv[1])) == NULL) //gethostbyname obtiene información de la maquina (IP si se dio un nombre)
{
perror ("gethostbyname"); // Si hay error, sale y despliega el error
exit (1);
}
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket"); // Si hay error (SOCKFD == -1), sale y despliega el error
exit (1);
}
direc.sin_family = AF_INET; // Se indica que se usará la Familia de Direcciones de Internet
direc.sin_port = htons(PORT); // convierte PORT desde el orden de bytes del host al de la red
direc.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(direc.sin_zero), '