Cliente servidor

Hola! Mi nombre es Karen, estudio en la Universidad de Morón (Argentina) Lic. En sistemas. Mi pregunta es la siguiente, tengo que armar un cliente en visual basic y un servidor en linux. Yo armé una calculadora en visual que envía de a 1 carácter y luego el servidor los guarda en un vector para realizar la operación y devolver el resultado. El problema es que no podemos lograr que el servidor reciba correctamente los datos, yo le envío un número y recibe cualquier cosa.
¿No sabes que puedo hacer o donde puedo llegar a encontrar información sobre este tema?
Desde ya muchas gracias
Karen
Respuesta
1
Supongo que habrás hecho bien el crear el socket, el bind, el listen, el accept y demás, porque cosas te llegan aunque sean raras.
Decirte que en la transmisión de datos a través de sockets debes tener muy en cuenta que a través de la red van bits agrupados en bytes, es decir, al socket le da lo mismo lo que envíes (char, int, struct, float, double...), el va a enviar un flujo de bytes de un ordenador a otro, por lo tanto es muy importante que lo que envíes desde un ordenador sea del mismo tipo que el dato que esperar recibir en el otro ordenador.
Si tu deseas enviar un int haces:
Perdona lo de antes, di a enviar sin querer, bueno a lo importante que si quieres enviar un int:
int valor = 100;
write(socket,(char *)& valor, sizeof(int),0);
y al recibir:
int res;
read(socket,(char*)& res, sizeof(int),0);
Es muy importante que en los dos lados pongas sizeof(int) para que envíe 4 bytes y reciba 4 bytes (sizeof(int)=4).
en tu caso que envias cadena de caracteres, has de saber que si pones:
char* valor="345.667";
write(socket,valor,sizeof(char),0);
Esto esta mal, porque el tamaño de sizeof(char)=1 pero tu no envías 1 carácter sino 7 caracteres (los 6 números y el punto), debes poner:
write(socket,valor,strlen(valor),0);
y en el ordenador receptor debes poner:
char* res = new char[200]; o malloc(.....) segun sea c o c++
Como no sabes el tamaño de la cadena de caracteres que envías, pues reserva memoria de más y ya esta.
int bytes = read(socket,res,200,0);
Y ahora debes saber que los datos recibidos son la cadena de caracteres sin el carácter de final de cadena ('\0') por lo que debes añadírselo tu al final
res[bytes] = '\0';
Con esto ya tienes en res el 345.667
En resumen que tenga mucho cuidado con los tamaños de las cosas que envías y que las cadenas de caracteres hay que tratarlas con un poco más de cuidado pues no se envía el carácter de fin de cadena.

3 respuestas más de otros expertos

Respuesta
1
Supongo que estás usando el control Winsock, el servidor tendría que hacer algo como:
Option Explicit
Dim Num
Private Sub Form_Load()
Num = 0 'Para el array de winsocks
TcpServer(0). LocalPort = 24458 'El Puerto TCP donde va a escuchar
tcpServer(0). Listen 'Empieza a escuchar
End Sub
' Cuando alguien intente conectar...
Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long) 'client requests to connect
Num = Num + 1 'Aumenta el numero de sockets
Load tcpServer(Num) 'Carga un nuevo socket exclusivamente para el nuevo cliente
tcpServer(Num).Accept requestID 'Vincula el nuevo socket al cliente
'... Hace las operaciones que sean
tcpServer(Num).SendData "HOLA" 'Envia algo al cliente (si quieres)
End Sub
' llegan datos al socket determinado por Index
Private Sub tcpServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String ' Para almacenar los datos
tcpServer(Index).GetData strData 'Recibe los datos que le han llegado
'... Hace las operaciones que sean
tcpServer(Index).SendData "RESPUESTA" 'Envia RESPUESTA algo al cliente
End Sub
Respuesta
1
Ten cuidado sobre todo con los tipos de datos que estás pasando, ya que igual por un lado estás mandado no sé cuántos bytes y en el otro lado recogiendo una cantidad diferente.
Yo hice una cosa parecida entre C y Java y lo más problemático era eso, los distintos tipos de datos. Otra cosa no sé decirte.
¿Estás segura de que el servidor funciona bien?
Suerte.
Respuesta
1
Que modo de conexión empleáis, por si los datos viajan aplanados o no. Es posible que debas definir bien el tipo de datos que envías y el que recibes dado que puedes estar enviando más o menos bits de los esperados y con un formato que no sea de linux.
Dame más información y podré ayudar algo más.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas