Veo que te has puesto manos a la obra.
He estado ocupado pero en un ratito libre he preparado un ejemplo a bajo nivel con WinSock en programas de consola. Se trata de un pequeño prototipo de chat con modelo cliente servidor y protocolo TCP aceptando una sola conexión, para no liar la cosa.
Dejo el código muy comentado por si más adelante te interesa el manejo a bajo nivel sin componentes:
Servidor:
Código PHP:
int main(int argc, char* argv[])
{
WSADATA Wsa;
SOCKET Sock_e; // Sock de escucha
SOCKET Sock_c; // Sock de comunicación
struct sockaddr_in Server, Client, AddrEnRoute;
int Len=0;
char Buffer[1024];
DWORD Port = 9999;
// Inicializamos
printf("Inicializando el servidor...\n");
if(WSAStartup(MAKEWORD(2, 0), &Wsa) != 0) return 0;
//Creamos el socket
if((Sock_e = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) != INVALID_SOCKET){
// Dirección IP y puerto
Server.sin_family = AF_INET;
Server.sin_addr.s_addr = INADDR_ANY;
Server.sin_port = htons(Port);
AddrEnRoute = Server;
AddrEnRoute.sin_addr = *((struct in_addr *)gethostbyname("localhost")->h_addr);
// Asociamos el socket al puerto
if(bind(Sock_e, (SOCKADDR*)&Server, sizeof(Server)) != -1){
// Bucle principal del servidor
// Este servidor nunca termina, siempre escuchará
while(true){
// Escuchando puerto
printf("\nEscuchando por el puerto %d\n", Port);
if (listen(Sock_e, 1) != -1){
//hay una conexión entrante y la aceptamos
Len = sizeof(sockaddr);
Sock_c = accept(Sock_e,(sockaddr*)&Client, &Len);
if(Sock_c == INVALID_SOCKET) continue;
strcpy(Buffer, "Aceptada conexión\n\n");
printf(Buffer);
// Bucle de comunicación
do{
// Leemos los datos entrantes
Len = recv(Sock_c, Buffer, sizeof(Buffer), 0); //recibimos los datos que envie
if(Len<0) continue;
// Si tenemos datos seguimos
printf("- "); printf(Buffer);
if(!strnicmp(Buffer, "Adios", 5)) break;
printf("\n>> ");
gets(Buffer);
strcat(Buffer, "\n");
send(Sock_c, Buffer, lstrlen(Buffer)+1, 0);
} while(Len && Len!=-1);
closesocket(Sock_c);
}
} // While(true)
closesocket(Sock_e);
} // if(bind)
} // if(Sock_e)
WSACleanup();
return 0;
}
Cliente:
Código PHP:
int main(int argc, char* argv[])
{
WSADATA Wsa;
SOCKET Sock;
struct hostent *host;
struct sockaddr_in direc;
DWORD Port = 9999;
char Buffer[1024];
int Len;
bool Salir = false;
//Inicializamos la librería winsock
printf("Inicializando Cliente....\n\n");
WSAStartup(MAKEWORD(2,2),&Wsa);
//creamos el Sock y comenzamos el bucle principal
while(!Salir){
Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(Sock !=-1){
//Dirección IP del servidor y Puerto
host = gethostbyname("localhost");
direc.sin_family=AF_INET;
direc.sin_port = htons(Port);
direc.sin_addr = *((struct in_addr *)host->h_addr);
ZeroMemory(direc.sin_zero, 8);
// Pedimos conexión al servidor
printf("Esperando conexión al servidor...\n\n");
while(connect(Sock, (sockaddr *)&direc, sizeof(sockaddr))){Sleep(200);}
printf("Conexión aceptada\n\n");
// Saludamos
strcpy(Buffer, "Gracias por aceptar la conexión\n");
printf(">> "); printf(Buffer);
send(Sock, Buffer, lstrlen(Buffer)+1, 0);
//mientras el Sock no se haya desconectado
do {
Len = recv(Sock, Buffer, sizeof(Buffer), 0);
if(Len<0) continue;
// Si hay satos, seguimos
printf("- "); printf(Buffer);
if(!strnicmp(Buffer, "Adios", 5)) {Sleep(400); Salir = true; break;}
printf("\n>> ");
gets(Buffer);
strcat(Buffer, "\n");
send(Sock, Buffer, lstrlen(Buffer)+1, 0);
} while(Len && Len!=-1);
closesocket(Sock);
}
Sleep(500);
}
WSACleanup();
return 0;
}
Saludos.