Hola MeCraniDOS, gracias por tu respuesta al final me ha funcionado con tus correcciones, gracias
Sinceramente vengo de lenguajes de alto nivel como js,php,as3,vb y c# y me cuesta mucho entender cosas como los punteros o por ejemplo me choca que no pueda comparar 2 cadenas tal cual en fin tiene mucha telita el c. supongo que al disponer de acceso a más bajo nivel se tiene más control pero para los cabeza duras como yo se nos hace un mundo.
Ya que estoy aprovecho para preguntar algunas cosillas, yo ahora mismo estoy programando en c con el notepad++ desde windows, cada vez que realizo algún cambio en el programa y quiero probarlo tengo que subirlo al ftp del vps(centos) después desde el putty lo compilo, mato el proceso del programa anterior desde el power panel y vuelvo a ejecutar el actualizado desde el putty para poder después probar el cambio realizado en el programa.
La pregunta es, hay alguna manera desde windows que yo pueda debuguear el servidor de sockets sin tener que hacer todos esos pasos cada vez que hago un cambio?
y para terminar, antes de seguir con el servidor de sockets en c me recomiendan algún otro lenguaje de más alto nivel para hacer el servidor de sockets pero que se ejecute desde linux como lo hace el c?
Bueno pues eso es todo, gracias y si sigo con el c seguramente iré viniendo más a menudo a visitarles jeje
Aquí dejo el código final de la duda anterior por si a alguien le sirve
#include<stdio.h>
#include<string.h> //strlen
#include<sys/socket.h>
#include<arpa/inet.h> //inet_addr
#include<unistd.h> //write
int main(int argc , char *argv[]){
int SOCKET_MASTER;
int SOCKET_CLIENT;
int sockAddrClientLen;
int read_size;
struct sockaddr_in structServer;
struct sockaddr_in structClient;
char xml_message[] = "<?xml version=\"1.0\"?><!DOCTYPE cross-domainpolicy- SYSTEM \"http://www.adobe.com/xml/dtds/crossdomain.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>";
char error_message[] = "No se a enviado el xml porque no coincide el comando, la cadena recibida a sido:\n";
char buffer[2000];
/*
* Creamos el SOCKET_MASTER
*/
if ((SOCKET_MASTER = socket(AF_INET , SOCK_STREAM , 0)) == -1){
printf("Could not create socket"); }
/*
* Cumplimentamos los valores de configuracion de la estructrua sockaddr_in
*/
structServer.sin_family = AF_INET;
structServer.sin_addr.s_addr = INADDR_ANY;
structServer.sin_port = htons( 843 );
/*
* Enlazamos el socket master a la ip y el puerto especificado en la estructura del server
*/
if( bind(SOCKET_MASTER,(struct sockaddr *)&structServer , sizeof(structServer)) < 0){
puts("Fallo en el enlace/Bind"); return 1;
}else{
puts("Enlace realizado"); }
/*
* Ponemos el socket a la escucha y con un maximo de 5 clientes en espera
*/
listen(SOCKET_MASTER , 5);
puts("Esperando conexiones entrantes..."); /*
* Ponemos el socket a la escucha y con un maximo de 5 clientes en espera
*/
sockAddrClientLen = sizeof(struct sockaddr_in);
/*
* Comprobamos mediante un bucle si se conecta algun cliente por el socket_master, si es asi aceptamos la conexion y creamos un nuevo socket para el cliente
*/
while( (SOCKET_CLIENT = accept(SOCKET_MASTER, (struct sockaddr *)&structClient, (socklen_t*)&sockAddrClientLen)) ){
puts("Conexion establecida al servicio de crossdomain policy"); //Inicializamos el buffer a 0
//Comprovamos si el cliente conectado nos envia algun dato
while( (read_size = recv(SOCKET_CLIENT , buffer , 2000 , 0)) > 0 ){
//Mostramos en consola/putty el mensaje del cliente
//Comparamos si el mensaje enviado por el cliente coinciden los 20 primeros digitos con la siguiente cadena -> <policy-file-request/>
if(strcmp(buffer
, "<policy-file-request/>")==0){ //Si coincide le enviamos al cliente el xml
write
(SOCKET_CLIENT
, xml_message
, strlen(xml_message
)); }else{
//Si no coicide avisamos al cliente y le devolvemos tambien lo que nos envio el
write
(SOCKET_CLIENT
, error_message
, strlen(error_message
)); write
(SOCKET_CLIENT
, buffer
, strlen(buffer
)); }
//Reiniciamos a 0 el buffer
}//End While read_size
if(read_size == 0){
puts("Cliente desconectado"); fflush(stdout
);//Forzamos a mostrase la cadena del buffer en consola }else if(read_size == -1){
}
}//End While SOCKET_CLIENT
if (SOCKET_CLIENT<0){
perror("Error al Aceptar el nuevo Cliente/Socket"); return 1;
}
return 0;
}
MeCraniDOS cante victoria demasiado pronto, al ver que me devolvia el xml di por sentado que ya funcionava bien, pero el problema ahora es que mande lo que mande desde el telnet al servidor el servidor me devuelve el xml y solo me lo tiene que devolver si yo le mando la cadena <policy-file-request/>
PD: ya esta solucionado xd en la linea 70 estaba enviando nuevamente la variable xml_message y tenia que poner la variable error_message, ya esta corregido en el codigo.
Bueno pues sigue fallando... la que estoy liando qie si va que si no va.. en fin.
Ahora cuando envio una cadena desde telnet por ejemplo "hola"
en la consola muestra primero la primera lentra en una linea y el restro de la frase en la otra
por ejemplo:
h
ola
Sin envio "elhacker"
en consola me aparece
e
lhacker
supomngo que por eso cuando envio "<policy-file-request/>"
la sentencia if no se cumple y no me envia el xml
porque en vez de llegar al buffer la cadena "<policy-file-request/>" llega primero el "<" y luego el resto "policy-file-request/>"
es como si la linea del -> while( (read_size = recv(SOCKET_CLIENT , buffer , 2000 , 0)) > 0 ){
leiera el primer caracter del comando recibido y lo enviara y despues leiera el resto del comando
Si envio el comando desde telnet precedido por un espacio o alguna letra entonces funciona
por ejemplo:
x<policy-file-request/>
el servidor muestra en una linea la x y en la siguiente el resto
x
<policy-file-request/>
Entonces como se cumple la sentencia me devuelve el xml
Alguien sabe a que es debido ese comportamiento, porque el servidor corta la primera letra del resto de la cadena y lo muestra por separado?
Bueno espero que esta sea la ultima vez que digo que ya funciona bien y luego no..
En principio el problema venia por hacer las pruebas desde telnet, no me pregunteis porque, porque no tengo ni puñetera idea.
La cuestion es que he creado un cliente en flash me conectado y funciona a las mil maravillas
Saludos