Seguimos buscando a Arshak. Ayudanos compartiendo!
Encuesta no oficial de docentes
Resultados de la encuesta no oficial de docentes
Probaste el SIGA Helper?

Donar $100 Donar $200 Donar $500 Donar mensualmente


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Sockets Sist. Operativos
Autor Mensaje
francomorales96 Sin conexión
Campeon del cubo Rubik
The Engineer
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 132
Agradecimientos dados: 13
Agradecimientos: 75 en 15 posts
Registro en: Jan 2009
Mensaje: #1
Sockets Sist. Operativos Trabajo practico Sistemas Operativos
Hola gente, les cuento que este cuatrimestre curso por primera vez sist. operativos. Me dijeron q estaria bueno que empieze sabiendo algo de C y de programación de sockets.
Bueno por eso cree este tema porque queria q me orienten con la programación de sockets, encontre algo de material pero se diferencia si es para Windows o para linux. Queria saber q me conviene encarar con linux o windows ? q me serviría mas para operativos?
Si tienen alguna pagina / libro lo que sea para darme una mano estaria muy agradecido! muchas gracias!
Y disculpen mi ignorancia la verdad que esto de sockets es algo totalmente nuevo para mi.
10-03-2012 23:40
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gfl Sin conexión
Campeon del cubo Rubik
Sin estado :(
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 186
Agradecimientos dados: 1
Agradecimientos: 14 en 8 posts
Registro en: Jun 2009
Mensaje: #2
RE: Sockets Sist. Operativos
Hay varios tipos de sockets, los mas usados en operativos son los sockets af_inet sirven para enviar datos por una red son practicamente iguales en windows que en linux te recomiendo leer la beej guide para detalles de implementacion, tambien estan los sockets af unix que son exclusivos de unix, estos son para enviar datos de forma local, tambien estan detallados en la beej guide.

Saludos.
10-03-2012 23:48
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.163
Agradecimientos dados: 81
Agradecimientos: 232 en 78 posts
Registro en: Nov 2009
Mensaje: #3
RE: Sockets Sist. Operativos
Si no tenés Linux podés empezar con Windows sin problema, la diferencia que te vas a encontrar es que en Linux tenés que hacer más includes (en Windows tenés todo en winsock2.h, tenés que agregar -lwsock32 cuando compilás)

Además en Windows antes de empezar a usar las funcioens de sockets tenés que poner


WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {
return -1;
}


Y en Linux para cerrar sockets usas la función close mientras que en Windows es closeSocket. El resto de las funciones (socket, listen, bind, accept, connect, send, recv, select) se llaman igual en las dos. En linux además tenés pool y fork.

Podés leerte la guía beej y las C-talks, en la C-talk III tenés la parte de sockets(diapositiva 58):
http://www.utnianos.com.ar/foro/tema-sis...#pid186495
(Este mensaje fue modificado por última vez en: 11-03-2012 01:44 por Anirus.)
11-03-2012 01:32
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
francomorales96 Sin conexión
Campeon del cubo Rubik
The Engineer
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 132
Agradecimientos dados: 13
Agradecimientos: 75 en 15 posts
Registro en: Jan 2009
Mensaje: #4
RE: Sockets Sist. Operativos
Muchisimas gracias a los dos!! Me recomiendan bajarme el virtual box e instalarle por ejemplo Ubuntu para probar la parte de socket en linux? Igual voy a empezar con windows que es lo que actualmente estoy usando! muchas gracias a ambos =D
11-03-2012 11:54
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
AGUSTIN27 Sin conexión
Secretario de la SAE
INGENIEROOO :)
******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 642
Agradecimientos dados: 20
Agradecimientos: 114 en 25 posts
Registro en: Feb 2010
Mensaje: #5
RE: Sockets Sist. Operativos
Que lindo que fue cuando empezamos a mandar los primeros paquetes y llegaban ... Pensabamos que ya teniamos todo listo, pero aún así nos faltaba muchísimo para terminar el TP, por suerte lo aprobamos de una, la cursada y el TP. Ponele muchas ganas y la vas a aprobar. Saludos!
11-03-2012 12:20
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Imakuni Sin conexión
Presidente del CEIT
Boxes tastes like mush
********

Ing. en Sistemas
Facultad Regional Córdoba

Mensajes: 7.021
Agradecimientos dados: 124
Agradecimientos: 129 en 85 posts
Registro en: Jul 2008
Mensaje: #6
RE: Sockets Sist. Operativos
Cita:Me recomiendan bajarme el virtual box e instalarle por ejemplo Ubuntu para probar la parte de socket en linux?

Si tenes una maquina potentosa, entonces bajatelo y probalo.

En mi grupo utilizabamos la maquina virtual que te daban, que era solo con consola... y en algunas pcs viejas, instalamos Debian y le pusimos xfce (una interfaz grafica liviana...), creo que hay un ubuntu con xfce llamado "xubuntu". Te diria que, si queres instalar un ubuntu, pruebes ese asi la maquina no se te muere =P.

Y como ya dijeron: Leete la guia BEEJ, que es LA posta.

http://www.google.com.ar/search?aq=f&sou...=Guia+BEEJ
11-03-2012 16:21
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
Sin estado :(
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 791
Agradecimientos dados: 85
Agradecimientos: 473 en 57 posts
Registro en: Mar 2011
Mensaje: #7
RE: Sockets Sist. Operativos
Bueno, hoy empece con C y creo que avance bastante. Te recomiendo el libro 'Aprendiendo C en 21 dias', es muy completo, aunque no imprescindible.

Me queda ver punteros, como grabar en disco y recien ahi me voy a poner con sockets =P Lei un poco la guia de beej y es excelente
11-03-2012 23:44
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Imakuni Sin conexión
Presidente del CEIT
Boxes tastes like mush
********

Ing. en Sistemas
Facultad Regional Córdoba

Mensajes: 7.021
Agradecimientos dados: 124
Agradecimientos: 129 en 85 posts
Registro en: Jul 2008
Mensaje: #8
RE: Sockets Sist. Operativos
Como grabar en disco es un tema =P.

Al menos en mi TP, en linux podias usar las funciones normales que vienen con C.

En Windows, tenias que usar la API de win32 que es medio pijazo.


Con punteros no podiamos usar malloc (en linux si), si no que teniamos que usr otra funcion de windows llamada HeapAlloc, aunque en este caso era muy parecido =P.
11-03-2012 23:49
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Nikod11 Sin conexión
Secretario General
Sin estado :(
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 791
Agradecimientos dados: 85
Agradecimientos: 473 en 57 posts
Registro en: Mar 2011
Mensaje: #9
RE: Sockets Sist. Operativos
Ajam, deberiamos manejar ambas APIS (Linux y win32)?

Chusmie un poco el tp del año pasado y era un armar un servidor ftp que usaba ambas, o al menos eso me parecio.
12-03-2012 00:24
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Imakuni Sin conexión
Presidente del CEIT
Boxes tastes like mush
********

Ing. en Sistemas
Facultad Regional Córdoba

Mensajes: 7.021
Agradecimientos dados: 124
Agradecimientos: 129 en 85 posts
Registro en: Jul 2008
Mensaje: #10
RE: Sockets Sist. Operativos
Cita:Ajam, deberiamos manejar ambas APIS (Linux y win32)?

Chusmie un poco el tp del año pasado y era un armar un servidor ftp que usaba ambas, o al menos eso me parecio.

Ni idea. Yo lo hice en el 2008 creo =P.
12-03-2012 00:28
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gfl Sin conexión
Campeon del cubo Rubik
Sin estado :(
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 186
Agradecimientos dados: 1
Agradecimientos: 14 en 8 posts
Registro en: Jun 2009
Mensaje: #11
RE: Sockets Sist. Operativos
Yo hice el tp en el 1°Q de 2011 2 entregas en windows 2 en linux y es como dice imakuni, en el 2° Q era solo linux, supongo que varia segun el trabajo practico, pero es parecido, lo importante es que sepas en tu cabeza como plantear el tp en lineas generales el resto son detalles de implementacion menores.
12-03-2012 00:49
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Anirus Sin conexión
Super Moderador
Sin estado :)
*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 1.163
Agradecimientos dados: 81
Agradecimientos: 232 en 78 posts
Registro en: Nov 2009
Mensaje: #12
RE: Sockets Sist. Operativos
Yo también la cursé en el 1C, de Windows se pedía usar sólo algunas funciones de la API(creo que no más de 10), las mencionaba el enunciado, tenías que googlear qué hacían y qué parámetros llevaban y listo, lo feo era que tenían muchos parámetros y algunos eran estructuras y tenías que leer también cómo estaban compuestas para saber cómo usarlas(o con qué otras funciones crearlas), pero no es algo que tuvieras que saber antes de cursar, lo aprendías sobre la marcha.
(Este mensaje fue modificado por última vez en: 12-03-2012 14:42 por Anirus.)
12-03-2012 14:17
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
NathanDrake Sin conexión
Profesor del Modulo A
...
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 399
Agradecimientos dados: 16
Agradecimientos: 92 en 23 posts
Registro en: Apr 2010
Mensaje: #13
RE: Sockets Sist. Operativos
Estoy usando la guía beej para sockets y en mis programas parece que no llegan los sockets cry . ¿Alguien tiene alguna guía más profunda? =P
11-08-2012 21:41
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
matias22 Sin conexión
Campeon del cubo Rubik
Sin estado :(
****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 192
Agradecimientos dados: 1
Agradecimientos: 4 en 4 posts
Registro en: Aug 2008
Mensaje: #14
RE: Sockets Sist. Operativos
La guia beej es bastante completa y clara. Seguramente estas haciendo algo mal.

Buscate en google ejemplos de cliente y servidor, fijate como funcionan y juga con los mismos. Comparalos con lo que vos hiciste y segui intentando.

Tambien podes compartir el codigo para que te demos una mano.
12-08-2012 04:59
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
NathanDrake Sin conexión
Profesor del Modulo A
...
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 399
Agradecimientos dados: 16
Agradecimientos: 92 en 23 posts
Registro en: Apr 2010
Mensaje: #15
RE: Sockets Sist. Operativos
Bueno, al final pude recibir sockets, pero quise ir un poco mas alla y usar la funcion select.

Estoy abriendo el server y dos clientes.

Estoy teniendo dos problemas:

1) Sólo me reconoce una conexión (puse que me imprima en pantalla cuando haya una nueva conexión). De hecho ambos clientes se conectan porque ninguno me tira el error de que no se pudo conectar, pero sólo llega el mensaje del cliente que abrí primero.
2) No me imprime más de 8 caracteres del buffer...
3) Cuando el server recibe un mensaje, lo recibe y se cierra (se supone que no lo tendria que hacer, esta todo en un ciclo infinito)

Del 1 seguro me estoy comiendo algo en el código, pero en el 2 no tengo ni la más mínima idea que puede ser.

Server

/*
============================================================================
Name : serverMulti.c
Description : Server Multi Conexiones
============================================================================
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

#define MAXCLIENTES 10
#define MIN 50
#define PORT 38432

void checkError(int, char*);

int main(void) {
struct sockaddr_in direccionServer;
struct sockaddr_in direccionCliente;
char *buffer = NULL;
int yes = 1;
int socketServer, socketCliente;
int binder, reutilizer, listening, receive, sender; /*variables que toman los valores que devuelven las respectivas
funciones para chequear errores*/
unsigned int addrlen;
int bytesRecibidos = 0, bufferSize = MIN;

int i = 0;
int socketsDeClientes[MAXCLIENTES]; /*Array que alberga los descriptores de los clientes que se nos conecten*/
fd_set read_descriptors; /*Es una estructura que va a guardar los descriptores que esten para leer*/
int maxDescriptores = 0; /*Indica la cantidad maxima de descriptores hasta el momento*/
int posUltimoCliente = 0;

socketServer = socket(AF_INET, SOCK_STREAM, 0);

checkError(socketServer, "SOCKET\n");

reutilizer = setsockopt(socketServer, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));

checkError(reutilizer, "REUTILIZAR PUERTO\n");

direccionServer.sin_family = AF_INET;
direccionServer.sin_port = htons(PORT);
direccionServer.sin_addr.s_addr = htonl(INADDR_ANY); //mi propia direccion IP
memset(&(direccionServer.sin_zero), '\0', 8);

binder = bind(socketServer, (struct sockaddr *)&direccionServer, sizeof(direccionServer));

checkError(binder, "BIND\n");

maxDescriptores = socketServer; /*el socketServer va a ser el descriptor de valor maximo por el momento*/

bzero(socketsDeClientes, MAXCLIENTES);

/*pongo el socket a escuchar nuevas conexiones*/
listening = listen(socketServer, MAXCLIENTES);

checkError(listening, "LISTENING\n");

/*meto el descriptor del socket del server en read_descriptores*/

FD_ZERO(&read_descriptors); /*vacio read_descriptors primero*/
FD_SET(socketServer, &read_descriptors); /*Meto el socket del servidor en la estructura*/

while(1){

select(maxDescriptores + 1, &read_descriptors, NULL, NULL, NULL); /*hago select*/

/*se trata el server, se entra aca si se recibe una nueva conexion*/
if (FD_ISSET(socketServer, &read_descriptors)){
puts("AVISO: Nueva conexion.");

addrlen = sizeof(direccionCliente);
socketCliente = accept(socketServer, (struct sockaddr *)&direccionCliente, &addrlen);
checkError(socketCliente, "ACCEPT\n");

//agrego el descriptor al array de clientes y luego lo setteo en read_descriptors
socketsDeClientes[posUltimoCliente] = socketCliente;
FD_SET(socketCliente, &read_descriptors);

//asigno el valor del descriptor del cliente nuevo al de maxDescriptores si es mayor a este
if (socketCliente>maxDescriptores) maxDescriptores = socketCliente;

posUltimoCliente++;
}


/*se tratan los sockets clientes*/
for (i = 0; (i < MAXCLIENTES); i++){

if (FD_ISSET(socketsDeClientes[i], &read_descriptors)){
/*uno de los clientes envio informacion, se tratan aca*/

/*agrando el buffer hasta que sea lo suficientemente grande como para contener el mensaje en su totalidad*/

do{
bufferSize += 10;
if (buffer == NULL){
buffer = malloc(MIN);
bzero(buffer, MIN);
} else {
buffer = realloc(buffer, bufferSize);
bzero(buffer, bufferSize);
}

bytesRecibidos = recv(socketsDeClientes[i], buffer, sizeof(buffer), MSG_PEEK);

} while (bufferSize < bytesRecibidos);

/*ahora si recibo el paquete completo*/

receive = recv(socketsDeClientes[i], buffer, sizeof(buffer), 0);

checkError(receive, "RECV\n");

printf("Cliente %i: %s\n", i , buffer);

free(buffer);
buffer = NULL;

sender = send(socketsDeClientes[i], "Mensaje enviado correctamente.", strlen("Mensaje enviado correctamente."), 0);

checkError(sender, "SEND\n");

}

}

}

/*cierres*/
for (i = 0; i <= posUltimoCliente; i++){
close(socketsDeClientes[i]);
}

close(socketServer);
free(buffer);

return EXIT_SUCCESS;
}

void checkError(int valor, char *mensajeError){
if (valor == -1){
perror(mensajeError);
exit(1);
}
}




Cliente

/*
============================================================================
Name : client.c
Description : CLIENT
============================================================================
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <netdb.h>

#define BACKLOG 10
#define MIN 50
#define PORT 38432

/*
* Estructura sockaddr_in
*
* Reemplaza a sockaddr, generalmente se lo usa casteado: (struct sockaddr *)VariableDeTipoSockaddr_in
*
* Nombre de Valor: descripcion: que se le asigna
* sin_family: familia de direcciones: AF_INET
* sin_port: numero de puerto: htons(NUMPUERTO)
* sin_addr.s_addr: direccion de internet: inet_addr("direccion IP") o htonl(INADDR_ANY) si uso la de mi PC
* sin_zero[8]: relleno para preservar el tamanho: inicializar con memset(puntero, valor, bytes)
*
*/

void checkError(int, char*);

int main(void) {
int sockfd, s, r;
char *buffer = NULL, hostname[40];
struct hostent *server;
struct sockaddr_in direccionServer;
int bytesRecibidos = 0, bufferSize = MIN;
char mensaje[300];

/*obtengo el hostname*/

gethostname(hostname, sizeof hostname);

/*setteo descriptor del socket al que me voy a conectar*/
sockfd = socket(AF_INET, SOCK_STREAM, 0);

checkError(sockfd, "SOCKET\n");

server = gethostbyname(hostname);

if (server == NULL) {
perror("gethostbyname");
exit(1);
}

/*setteo la direccion del server*/

direccionServer.sin_family = AF_INET;
direccionServer.sin_port = htons(PORT);
bcopy((char *)server->h_addr,(char *)&direccionServer.sin_addr.s_addr,server->h_length);
memset(&(direccionServer.sin_zero), '\0', 8);

/*conecto a server*/
checkError(connect(sockfd, (struct sockaddr *)&direccionServer, sizeof(direccionServer)), "CONNECT\n");

/*mando un mensaje*/

puts("Manda un mensaje:");
scanf("%s", mensaje);

s = send(sockfd, mensaje, strlen(mensaje) + 1, 0);

checkError(s, "SEND\n");

/*agrando el buffer hasta que sea lo suficientemente grande como para contener todo el paquete*/
do{
bufferSize += 10;
if (buffer == NULL){
buffer = malloc(MIN);
bzero(buffer, MIN);
} else {
buffer = realloc(buffer, bufferSize);
//bzero(buffer, bufferSize);
}

bytesRecibidos = recv(sockfd, buffer, sizeof(buffer), MSG_PEEK);

} while (bufferSize < bytesRecibidos);

/*ahora si recibo el mensaje*/
r = recv(sockfd, buffer, sizeof(buffer), 0);

checkError(r, "RECV\n");

printf("Server: %s\n", buffer);

/*cierres*/
free(buffer);
close(sockfd);

return EXIT_SUCCESS;
}

void checkError(int valor, char *mensajeError){
if (valor == -1){
perror(mensajeError);
exit(1);
}
}


(Este mensaje fue modificado por última vez en: 16-08-2012 03:55 por NathanDrake.)
16-08-2012 03:29
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 2 invitado(s)