Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
 int Send(const void *buf, unsigned int len) {
     return NetSendTCP(socket, buf, len);
 }
Ejemplo n.º 3
0
/**
**  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;
}