Buenas.... Aunque yo sea un programador LINUX puedo dar una serie de consejos para el código que inicia la sesión servidor. Yo no soy un programador de Window$, sencillamente porque no es un sistema compatible 100% con la norna ISO/IEEE POSIX (Portable Operating System Interface), que permite portabilidad de los programas entre plataformas distintas.

Pues bien, el código para construir un servidor simple bajo el estandar POSIX y en ANSI C sería el siguiente. Evidentemente, este programa se compilará regularmente en cualquier casi cualquier plataforma que NO SEA MICRO$OFT WINDOW$.... Por cierto, utiliza sockets Berkley, no winsockets, por lo que el porte a otras plataformas sería muy facil.

En este ejemplo, el servidor escucha en el puerto 8000 (por decir uno cualquiera) y admite peticiones desde el cliente de un máximo de 16.384 bytes de datos (cantidad mas que razonable para estos menesteres)

#include < stdio.h >
#include < sys/socket.h >
#include < netinet/in.h >
#include < arpa/inet.h >
#include < netdb.h >

int port = 8000; //Número de puerto a la escucha... (se puede cambiar por el que queramos)

void main() {
struct sockaddr_in sin;
struct sockaddr_in pin;
int sock_descriptor;
int temp_sock_descriptor;
int address_size;
char buf[16384]; //Cadena de datos máximos que acepta del cliente (se puede cambiar, claro y hacerlo mas grande :-) )
int i, len;

sock_descriptor = socket(AF_INET, SOCK_STREAM, 0);
if (sock_descriptor == -1) {
perror("Llamada al socket");
exit(1);
}

bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);

if (bind(sock_descriptor, (struct sockaddr *)&sin, sizeof(sin)) == -1)
{
perror("llamada para unir");
exit(1);
}

if (listen(sock_descriptor, 20) == -1) //El 20 significa que puede aceptar una cola de entrada de hasta 20 conexiones (por ejemplo)
{
perror("Llamada para escuchar");
exit(1);
}

printf("Aceptando conexiones ...\n");

while(1) {
temp_sock_descriptor =
accept(sock_descriptor, (struct sockaddr *)&pin,
&address_size);
if (temp_sock_descriptor == -1) {
perror("Llamada para aceptar");
exit(1);
}

if (recv(temp_sock_descriptor, buf, 16384, 0) == -1) {
perror("Llamada a recv");
exit(1);
}

printf("Recibido del cliente:%s\n", buf);

if (send(temp_sock_descriptor, buf, len, 0) == -1) {
perror("Llamada para enviar");
exit(1);
}

close(temp_sock_descriptor);

}
}


Pues bien, según he podido consultar por internet, para que esto funcione bajo Window$ no hay nada más que cambiar todas las cabeceras por una sola, que sería la siguiente...

#include < winsock.h >

Según parece, en esta librería estan todas las definiciones de las funciones utilizadas en el programa, ya que son convenciones estandar hasta para el window$

Ah, se me olvidaba, habría que ejecutar WSAStartup() antes de hacer nada con la biblioteca de sockets. El código para hacerlo es algo parecido a esto:

#include < winsock.h >
{
WSADATA wsaData; // Si esto no funciona
//WSAData wsaData; // prueba esto en su lugar
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
fprintf(stderr, "WSAStartup falló.\n");
exit(1);
}

También tienes que decirle a tu compilador que enlace la biblioteca Winsock, que normalmente se llama wsock32.lib o winsock32.lib o algo así. Con VC++, esto puede hacerse con el menú Project , bajo Settings... Haz click en la pestaña Link y busca el cuadro titulado "Object/library modules". Añade "wsock32.lib " a esa lista.

No se la fiabilidad de todo esto, pero para los fines a los que está dirigido este programa servidor, habría que eliminar todo el código de gestión de errores y excepciones, es decir, eliminar todo el código donde ponga perror() y stderr...

Si quereis una explicación más detallada de lo que hace cada linea, me lo posteais o me mandais un mensaje privado y yo lo eleboro un poquito mas y os modifico este post con todas las explicaciones.

Saludos.