El problema está en que yo quiero recibir los carácteres recibidos como un bloque, es decir, como un comando completo. Pero cuando lo intento, pareciera ser que voy recibiendo byte a byte, en vez de toda la informacion transmitida.
Por favor, si pueden ayudarme estaría muy agradecido. Adjunto el código para que vean que el receptor no puede interpretar el comando "ATTACK".
Código
/* Enlazar Ws2_32 */ #define _WIN32_WINNT 0x0501 #include <stdio.h> #include <winsock2.h> #define PUERTO 8080 WSADATA wsa_data; SOCKET listen_socket, cliente; struct sockaddr_in clientinfo, servicio; int rtn; char buffer[256]; void print_buffer(char *buffer, unsigned int bytes) { while(bytes--) putchar(*buffer++); } int main() { if ((rtn = WSAStartup(MAKEWORD(2,2), &wsa_data)) != 0) { fprintf(stderr, "Error WSAStartup: %d\n", rtn); return 1; } if((listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { fprintf(stderr, "Error en socket: %d\n", WSAGetLastError()); WSACleanup(); return 1; } servicio.sin_family = AF_INET; servicio.sin_addr.S_un.S_addr = INADDR_ANY; servicio.sin_port = htons(PUERTO); if((rtn = bind(listen_socket, (struct sockaddr*) &servicio, (int) sizeof(servicio))) == SOCKET_ERROR) { fprintf(stderr, "Error en bind: %d\n", WSAGetLastError()); WSACleanup(); return 1; } if (listen(listen_socket, SOMAXCONN) == SOCKET_ERROR) { fprintf(stderr, "Error en listen: %d\n", WSAGetLastError()); closesocket(listen_socket); WSACleanup(); return 1; } if((cliente = accept(listen_socket, (struct sockaddr*)&clientinfo, NULL)) == INVALID_SOCKET) { fprintf(stderr, "Error en accept: %d\n", WSAGetLastError()); closesocket(listen_socket); WSACleanup(); return 1; } closesocket(listen_socket); printf("Cliente IP: %s\n", inet_ntoa(clientinfo.sin_addr)); do { rtn = recv(cliente, buffer, sizeof(buffer), 0); if(rtn > 0) { print_buffer(buffer, rtn); if(strcmp(buffer, "ATTACK") == 0){ printf("ATTACK COMMAND ISSUED!!\n"); } } else if(rtn == 0) printf("Cerrando la conexión...\n"); else { fprintf(stderr, "Error en recv: %d\n", WSAGetLastError()); closesocket(cliente); WSACleanup(); return 1; } } while(rtn > 0); closesocket(cliente); WSACleanup(); return 0; }