void SendResponseMessage(const char* message, const char mode) { int sent_bytes, total_sent_bytes = 0; #if !defined(WIN32) #if defined(__APPLE__) int flag; if (mode == 1 || mode == 3) // Set TCP cork { flag = 1; if (setsockopt(interfaceSocket, IPPROTO_TCP, TCP_NOPUSH, (char*) & flag, sizeof (flag)) == -1) { fprintf(stderr, "src/socket.c: SendResponseMessage setsockopt TCP_CORK.\n"); ExitFatal(-1); } } #else int flag; if (mode == 1 || mode == 3) // Set TCP cork { flag = 1; if (setsockopt(interfaceSocket, IPPROTO_TCP, TCP_CORK, (char*) & flag, sizeof (flag)) == -1) { fprintf(stderr, "src/socket.c: SendResponseMessage setsockopt TCP_CORK.\n"); ExitFatal(-1); } } #endif #endif while (total_sent_bytes < (int) strlen(message)) { sent_bytes = NetSendTCP(interfaceSocket, message + total_sent_bytes, strlen(message) - total_sent_bytes); if (sent_bytes == -1) { fprintf(stderr, "src/socket.cpp: unable to send bytes in SendResponseMessage().\n"); ExitFatal(-1); } total_sent_bytes += sent_bytes; } #if !defined(WIN32) #if defined(__APPLE__) if (mode == 2 || mode == 3) // Unset TCP cork { flag = 0; if (setsockopt(interfaceSocket, IPPROTO_TCP, TCP_NOPUSH, (char*) & flag, sizeof (flag)) == -1) { fprintf(stderr, "src/socket.c: SendResponseMessage setsockopt TCP_CORK.\n"); ExitFatal(-1); } } #else if (mode == 2 || mode == 3) // Unset TCP cork { flag = 0; if (setsockopt(interfaceSocket, IPPROTO_TCP, TCP_CORK, (char*) & flag, sizeof (flag)) == -1) { fprintf(stderr, "src/socket.c: SendResponseMessage setsockopt TCP_CORK.\n"); ExitFatal(-1); } } #endif #endif }
int Send(const void *buf, unsigned int len) { return NetSendTCP(socket, buf, len); }
/** ** Send a command to the meta server ** ** @param command command to send ** @param format format of parameters ** @param ... parameters ** ** @returns -1 fail, length of command */ int SendMetaCommand(const char *command, const char *format, ...) { int size = GameName.size() + Parameters::Instance.LocalPlayerName.size() + strlen(command) + 100; int ret = -1; char *p = new char[size]; if (p == NULL) { return -1; } char *s = new char[size]; if (s == NULL) { delete[] p; return -1; } // Message Structure // <Stratagus> if for Magnant Compatibility, it may be removed // Player Name, Game Name, VERSION, Command, **Paramaters** sprintf(s, "<Stratagus>\n%s\n%s\n%s\n%s\n", Parameters::Instance.LocalPlayerName.c_str(), GameName.c_str(), VERSION, command); // Commands // Login - password // Logout - 0 // AddGame - IP,Port,Description,Map,Players,FreeSpots // JoinGame - Nick of Hoster // ChangeGame - Description,Map,Players,FreeSpots // GameList - 0 // NextGameInList - 0 // StartGame - 0 // PlayerScore - Player,Score,Win (Add razings...) // EndGame - Called after PlayerScore. // AbandonGame - 0 char *newp; va_list ap; while (1) { /* Try to print in the allocated space. */ va_start(ap, format); int n = vsnprintf(p, size, format, ap); va_end(ap); /* If that worked, string was processed. */ if (n > -1 && n < size) { break; } /* Else try again with more space. */ if (n > -1) { /* glibc 2.1 */ size = n + 1; /* precisely what is needed */ } else { /* glibc 2.0 */ size *= 2; /* twice the old size */ } if ((newp = new char[size + 1]) == NULL) { delete[] p; delete[] s; return -1; } memcpy(newp, p, size * sizeof(char)); delete[] p; p = newp; } if ((newp = new char[strlen(s) + size + 2]) == NULL) { delete[] s; delete[] p; return -1; } strcpy(newp, s); delete[] s; s = newp; strcat(s, p); strcat(s, "\n"); size = strlen(s); ret = NetSendTCP(MetaServerFildes, s, size); delete[] p; delete[] s; return ret; }