itgapi.cpp

来自「D-ITG2.4源代码」· C++ 代码 · 共 152 行

CPP
152
字号
 /*	Component of the D-ITG 2.4 Platform
 *
 * 	
 *	copyright	: (C) 2004  	by Stefano Avallone, Alessio Botta, Donato Emma, 
 *					Salvatore Guadagno, Antonio Pescape'
 *					DIS Dipartimento di Informatica e Sistemistica				 
 *					(Computer Science Department)
 *					University of Naples "Federico II"	
 *	email:		: {stavallo, pescape}@unina.it, {abotta, demma, sguadagno}@napoli.consorzio-cini.it
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *      (at your option) any later version.
 */
 
 
#include "../common/ITG.h"

static int socket_r = 0;

#ifdef WIN32
int InitializeWinsock(WORD wVersionRequested)
{
	WSADATA wsaData;
	int err;

	err = WSAStartup(wVersionRequested, &wsaData);

	
	
	if (err != 0)
		return 0;	

	
	
	
	

	
	
	
	
	

	
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
		return 0;

	
	return 1;
}


char nameProgram[]="ITGapi";
#endif



int DITGsend(char *sender, char *message)
{
#ifdef WIN32
	if (InitializeWinsock(MAKEWORD(1,1)) != 1)	{
		fprintf(stderr, "WSAStartup() failed");
		exit(1);
	}
#endif

	struct addrinfo* locale = 0;
	
	freeaddrinfo(locale);


	
	getaddrinfo("0.0.0.0", NULL, NULL, &locale);
	socket_r = socket(locale->ai_family, SOCK_DGRAM, 0);
	if (socket_r  < 0)
		printf("error into create a socket  - DITGSend function \n");	

#ifdef LINUX_OS
	int flags;
	flags = fcntl(socket_r, F_GETFL, 0);
	fcntl(socket_r, F_SETFL, flags | O_NONBLOCK);
#endif

#ifdef WIN32
	unsigned long i = 1;
	ioctlsocket(socket_r, FIONBIO, &i);
#endif


	
	
	
	


	struct sockaddr_in Sender;
        struct hostent *host;

       Sender.sin_family = AF_INET;
        if (!(host = gethostbyname(sender))) {
                cerr << endl << "DITGsend: Invalid destination address" << endl;
                return -1;
        }
        memcpy((char *) &Sender.sin_addr, host->h_addr, host->h_length);
        Sender.sin_port = htons(DEFAULT_PORT_SENDER_MANAGER);
        if (sendto(socket_r, message, strlen(message), 0, (struct sockaddr *) &Sender,  sizeof(Sender)) != (int) strlen(message))
                return -1;
        return 0;

	
    	



 #ifdef DEBUG
	printf("Message send to Sender %d \n",size_s);
#endif

	return 0;
}


int catchManagerMsg(char **senderIP, char **msg)
{
        const int MaxBufferSize = 300;
        struct sockaddr_in Sender;
        socklen_t SenderSlen = sizeof(Sender);
        int length, msgtype;
        if (!socket_r)
                return MNG_NOMSG;
        char *buffer = (char *) malloc(sizeof(char) * MaxBufferSize);
        if (recvfrom(socket_r, buffer, MaxBufferSize, 0, (struct sockaddr *) &Sender, &SenderSlen) < 0) {
                free(buffer);
                return MNG_NOMSG;
        }
        *senderIP = (char *) malloc(sizeof(char) * 30);
        strcpy(*senderIP, inet_ntoa(Sender.sin_addr));
        msgtype = *(int *) buffer;
        length = ((int *) buffer)[1];
        memmove(buffer, ((int *) buffer) + 2, length);
        buffer[length] = '\0';
        *msg = buffer;
        return msgtype;
}





⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?