Hola amigos estoy intentando de hacer un servidor de sockets en c bajo linux y bueno sinceramente no tengo mucha idea de c y me cuesta bastante entenderlo, ya no tengo capacidad para aprender un lenguaje de tan bajo nivel.
Bueno a lo que iba solo quiero aprender lo que implica de un servidor de sockets para poder hacer un servidor para un juego, bueno en realidad serán 2 servidores un para el juego y el otro para servir un crossdomain.xml
De momento he empezado a hacer pruebas con el servidor encargado de servir el xml la lógica consiste en lo siguiente, el cliente se conecta al servidor de xml al puerto 843 y le manda una cadena, el servidor comprueba dicha cadena y si la cadena coincide le contesta con un xml, una vez el cliente tiene el xml se desconecta automáticamente de ese servidor y se conecta al servidor del juego, el problema reside en que no me devuelve el xml.
Para probar el servidor lo que hago de momento es conectarme a través de telnet y una vez conectado le envió la cadena "<policy-file-request/>" y el servidor debería enviarme el xml, pero no me lo devuelve
en la consola de putty puedo ver mediante el comando put() como la cadena que yo le envió al servidor le llega de la siguiente manera.
<
policy-file-request/>
El primer carácter lo muestra en una línea y el resto de la cadena en la siguiente, no sé si esto puede llegar a afectar en algo.
A mí en cambio en la consola de telnet el servidor me devuelve la cadena que yo le envié de manera correcta <policy-file-request/> pero me tendría que devolver también el xml
En definitiva el siguiente if no se está cumpliendo if(strcmp(buffer, "<policy-file-request/>")==0){
El código de ejemplo que estoy utilizando es este, agradezco cualquier corrección o ayuda.
#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_desc , new_socket , c;
struct sockaddr_in server , client;
char *message , buffer[2000];
int read_size;
//Create socket
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket"); }
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 843 );
//Bind
if( bind(socket_desc,(struct sockaddr *)&server , sizeof(server)) < 0)
{
return 1;
}
//Listen
listen(socket_desc , 5);
//Accept and incoming connection
puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in);
while( (new_socket = accept(socket_desc, (struct sockaddr *)&client, (socklen_t*)&c)) ){
puts("Conexion establecida al servicio de crossdomain policy"); //Miramos que nos dice el cliente
//memset(buffer, '\0', sizeof( buffer ));
// read_size = recv(new_socket , buffer , 20 , 0);
//Receive a message from client
while( (read_size = recv(new_socket , buffer , 2000 , 0)) > 0 ){
//Send the message back to client
if(strcmp(buffer
, "<policy-file-request/>")==0){//Si concuerda con la cadena "<policy-file-request/>" enviamos el cossdoamain al cliente 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>";
write
(new_socket
, message
, strlen(message
)); }
write
(new_socket
, buffer
, strlen(buffer
)); }
if(read_size == 0){
puts("Client disconnected"); }else if(read_size == -1){
}
}//End While
if (new_socket<0){
return 1;
}
return 0;
}