Ayuda con Programacion Sockets TCP en C

Hola a todo!

Pues tengo un problema con una pràctica de programacion de sockets TCP en C en Linux.
La tengo que entregar esta tarde asi que estoy acojonao, resulta simplemente que tengo que modificar el código para que el cliente y el servidor a la hora de enviar el mensaje aparezca antes de este la IP de cada uno de ellos y que luego se escriba fin y se cierre la conexión.

1. Cliente envia a servidor el texto hola.

2.Servidor recibe el texto hola pero con la IP de cliente delante.

3. Servidor devuelte el texto hola a cliente pero con la IP suya delante del texto.

4. Escribimos fin y se cierra la conexion.

CÓDIGO CLIENTE TCP

#include
#include
#include
#include
#include
#include
#include

int main(int argc, char *argv[])
{
int ID_socket_cli, result;
struct sockaddr_in address_ser, address_cli;
struct hostent *h;
char mensaje[] = "Esto es un mensaje al mundo.";


if(argc<2) {
printf("uso : %s servidor \n", argv[0]);
exit(1);
}


ID_socket_cli=socket(AF_INET, SOCK_STREAM,0);
if (ID_socket_cli==-1)
{
printf("error\n");
exit(-1);
}


address_cli.sin_family = AF_INET;
address_cli.sin_addr.s_addr = htonl(INADDR_ANY);
address_cli.sin_port = htons(0);

result = bind(ID_socket_cli, (struct sockaddr *) &address_cli, sizeof(address_cli)); if (result<0) {
printf("error\n");
exit(-1);
}



h = gethostbyname(argv[1]);
printf("Escribe mensaje para %s\n",inet_ntoa(*(struct in_addr *)h->h_addr_list[0]));
address_ser.sin_family = h->h_addrtype;
memcpy((char *) &address_ser.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
address_ser.sin_port = htons(6001);


result = connect(ID_socket_cli, (struct sockaddr *) &address_ser, sizeof(address_ser));
if (result<0) {
printf("error\n");
exit(-1);
}


do {
strcpy(mensaje,"");
gets(mensaje);
result = send(ID_socket_cli, mensaje, strlen(mensaje)+1, 0);
if (result<0) {
printf("error\n");
exit(-1);
}
} while(strncmp(mensaje,"fi",2));





return 0;

}



SERVIDOR TCP
#include
#include
#include
#include
#include
#include
#include

#define TAMBUFFER 256

int main()
{
int ID_socket_ser, ID_socket_ser2, result, long_cli;
struct sockaddr_in address_ser, address_cli;
char mensaje[TAMBUFFER];


ID_socket_ser=socket(AF_INET, SOCK_STREAM,0);
if (ID_socket_ser==-1)
{
printf("error\n");
exit(-1);
}


address_ser.sin_family = AF_INET;
address_ser.sin_addr.s_addr = htonl(INADDR_ANY);
address_ser.sin_port = htons(6001);

result = bind(ID_socket_ser, (struct sockaddr *) &address_ser, sizeof(address_ser));
if (result<0) {
printf("error\n");
exit(-1);
}


listen(ID_socket_ser,2);


long_cli = sizeof(address_cli);

ID_socket_ser2 = accept(ID_socket_ser, (struct sockaddr *) &address_cli, &long_cli);
if (ID_socket_ser2<0) {
printf("Error\n");
exit(-1);
}



do {
memset(mensaje,0x0,TAMBUFFER);
result = recv(ID_socket_ser2, mensaje, TAMBUFFER, 0);
if (result<0) {
printf("error\n");
exit(-1);
}
else
{
printf("%s\n",mensaje);
}
} while(strncmp(mensaje,"fi",2));


return 0;

}




La verdad es que no domino mucho pero se me acaba el tiempo, si alguien me puede orientar de como lo haría él, le estare eternamente agradecido.

Muchas gracias y saludos
La verdad es que es bastante fácil... si nos contaras un poco qué has intentado, quizá nos diera por ayudarte.

Como pista, échale un vistazo a las estructuras y funciones que se usan en el mismo código que nos has pasado.

Parece que nos pones el ejercicio para que TE lo resolvamos NOSOTROS. Si es así... ¿no has considerado la posibilidad de que lo justo es que suspendas?

- ferdy
No, no queria que me lo resolvierais simplemente algun consejo mas que nada porque es frustante ver codigo y codigo y no ver claramente lo que hace. He hecho que el servidor devuelva el mensaje al cliente pero no he sabido hacer lo de poner las IPs delante. Perdonad si ha parecido que queria que m lo resolvierais, no era mi intencion!
la verdad es que es una cosa muy típica, deberías haber googleado un poco, hay millones de ejemplos (este por ejemplo) muy parecidos a ese código que has pegado que ya te habrían servido :)
3 respuestas