Debe estar conectado para participar
Buscar en los foros:


 






Uso de Comodín:
*    coincide cualquier número de caracteres
%    coincide exactamente un caracter

El send se pone en marica.

No hay Etiquetas
Entrada
Nuevo miembro

ifmusic

entradas: 8

23:02 25/10/2005

1

Bueno, tengo un .c bastante extenso, la cosa es asi:
Tengo un hijo que hace las veces de "shell", osea necesito que por consola se le pasen ordenes al programa, Osea , si se escribe Q->sale, Query,pide un nombre y Envia una cadena por un socket, CLS->Envia una cadena por un socket.
El Problema es que el send NO envia un porongo.Nada. Miren el codigo un poco. Probe con Fgets y gets tambien y nada.

if ((pid=fork())==0) {
struct sockaddr_in address;
int create_socket;
char cadena[30];
char s[40];
char archivo[40];
char SCriteria[40];
int n;
address.sin_family = AF_INET;
address.sin_port = htons(atoi(PORT));
inet_pton(AF_INET,IPLOCAL,&address.sin_addr);

if ((create_socket = socket(AF_INET,SOCK_STREAM,0)) > 0)
if (connect(create_socket,(struct sockaddr *)&address,sizeof(address)) == 0)
fgets(cadena,29+1, stdin);
cadena[strlen(cadena)-1]='\0';

while (scanf("%s",cadena)){
printf("Ingrese Comando\n&quotwink;
//printf("cadena %s, longitud de cadena %d\n",cadena, strlen(cadena));
if (!strcmp(cadena,"peers&quotwink){
nbytes=send(create_socket,cadena,strlen(cadena),0) ;

}

if (!strcmp(cadena,"cls&quotwink)
{nbytes=send(create_socket,cadena,strlen(cadena),0 );
printf("enviados &quotwink;

}

if (!strcmp(cadena,"query&quotwink){
printf("cadena > %s\n",cadena);
scanf("%s",archivo);
printf("archivo > %s\n",archivo);
strcat(cadena, archivo);
printf("cadena > %s\n",cadena);
strcpy(SCriteria,cadena);
strcpy(cadena,"q&quotwink;
nbytes=send(create_socket,SCriteria,strlen(SCriter ia),0);
printf("enviados %d\n",nbytes);

}
if (!strcmp(cadena,"q&quotwink){ nbytes=send(create_socket,"q",strlen("q&quotwink,0);
break;}
}
close(create_socket);
return 0;

}

Cuando se llama a algun comando de los que deberian enviar no pasa NADA, quando mando q, todo lo que se habia enviado, se recibe. Es como q el send MANDA CUANDO QUIERE.
ej. si mande, cls (enter), cls(enter) q. el programa ejecuta 2 veces lo que corresponde al comando cls y luego sale.

Hardcore Extreme Level

74205

entradas: 3608

17:20 27/10/2005

2

te comento que va a ser un poco dificil que te respondan exactamente de eso. Algunos tienen una idea, pero no se si alguien sabra exactamente eso.
Yo, para serte sincero, no entiendo practicamente nada, agradece que logre hacer esto:

textures/74205/test_2a
{
qer_editorimage textures/74205/test_2a.tga
surfaceparm nomarks
surfaceparm nolightmap
surfaceparm trans
polygonOffset
{
map textures/74205/test_2a.tga
alphaFunc GT0
blendFunc GL_DST_COLOR GL_SRC_COLOR
}
{
map $lightmap
}
{
map textures/74205/test_2a.tga
blendFunc GL_DST_COLOR GL_ZERO
}
{
map textures/74205/gleamal4b.tga
blendFunc GL_ONE GL_ONE
rgbGen wave random 0 0.5 0 1
}
}

dejando eso atras, fijate de ver talvez en algun foro mas dedicado a programacion, ya que talvez aca estamos un poquito mas inclinados a la parte Hard y Soft "clasico".
Suerte

Extreme Level

ALF

entradas: 1564

11:03 28/10/2005

3

lee fgets.
char cadena[30];
fgets(cadena,29+1, stdin);
cadena[strlen(cadena)-1]='\0';

no sería mas bien fgets(cadena, 29, stdin); y listo ?
Como llamas a strlen(cadena) si la cadena no puedes asegurar si esta NULL terminada ? que pasa cuando hay 29 bytes en stdin ? que sucede con cadena ? con strlen(cadena) ?

luego haces
while (scanf("%s",cadena)){

realmentes esto es confuso, si ya tienes algo en la cadena para que vuelves a pedir input Sabés que es un do-while ?
El programa no funciona y va a ser muy dificil depurarlo así, escribí un codigo limpio, quita los scanf y usa fgets.
hacé fflush para que veas como forzar que se envien las cosas, y no uses scanf, usá fgets.

PD: Te recomiendo que esta clase de dudas las preguntes en un foro especializado en el tema donde haya más gente que te pueda ayudar, que de estos hay muchos, por mi parte se poco y nada. Como dijo 74205 este foro es más "hard"

SaLu2