
/*********************************************************************
*   < NETWORK.H >
**********************************************************************
*   ネットワークの操作
**********************************************************************
*                                                   Copyright (C) 2005
*   Programed by Ochi
*********************************************************************/

#ifndef HEADER_NETWORK
#define HEADER_NETWORK

#include "common.h"
#include "winsock.h"
#include "wininet.h"

#pragma comment(lib,"mpr.lib")
#pragma comment(lib,"wsock32.lib")
#pragma comment(lib,"wininet.lib")
#pragma comment(lib,"ws2_32.lib")

#define DEFAULT_PORT        50001       // このプログラムが通常使うポート番号
#define RECV_HTTP           5000        // HTTPで受信する最大バイト数
#define RECV_UDP            16384       // UDPで受信する最大バイト数

enum enNetwork{
    CONNECT_TYPE,
    NO_CONNECT,
    CLIENT,
    SERVER
};

/*********************************************************************
* FTPの通信クラス
*********************************************************************/
class CHttpNet
{
private:

public:
    CHttpNet();
    ~CHttpNet();
    LRESULT DownLoad ( PSZ, int, PSZ );
    LRESULT UpLoad ( PSZ, PSZ, PSZ, PSZ, PSZ, UINT );
};

/*********************************************************************
* LANの通信クラス
*********************************************************************/
class CLanNet
{
private:

public:
    CLanNet();
    ~CLanNet();
    bool    FolderPass ( PSZ, PSZ, PSZ );
    bool    CloseFolder ( PSZ );
};

/*********************************************************************
* ソケットクラス
*********************************************************************/
class CSocket
{
private:
    SOCKADDR_IN srcAddr;            // 自分アドレス情報
    SOCKADDR_IN dstAddr;            // 相手アドレス情報
    HOSTENT*    lpHost;             // ホスト情報
    UINT        nConnectType;       // クライアントかサーバか
    UINT        nIP;                // IPアドレス
    UINT        nProtocol;          // 使用するプロトコル
    UINT        nPort;              // 使用するポート
    UINT        nReceiveSize;       // 受信するパケットの最大バイト数
    UINT        nTimeOut;           // タイムアウト
    UINT        nType;              // 接続状態
    char        szHost[128];        // ホスト名またはIPアドレス
    SOCKET      srcSocket;          // 自分のソケット
    SOCKET      dstSocket;          // 相手のソケット
    WSADATA     wsaData;            // ソケット情報
    int         client_len;
    LRESULT     ConReady( void );   // 送信準備

public:
    CSocket () { nPort=50000; nConnectType=NO_CONNECT; nReceiveSize=5000; nTimeOut=30; }
    LRESULT Close ( void );                         // 切断
    LRESULT Connect ( void );                       // 接続
    void    ConnectByThread ( void );               // スレッドによる接続
    char*   ReceiveMessage ( void );                // 受信
    LRESULT ReturnObject( LRESULT );                // メソッドを渡す
    LRESULT SendMessage ( const char* );            // 送信
    LRESULT Setting ( char*, UINT, UINT, UINT );    // 設定
};

/*********************************************************************
* NTP構造体
*********************************************************************/
struct NTP_Packet
{
    int Control_Word;
    int root_delay;
    int root_dispersion;
    int reference_identifier;
    __int64 reference_timestamp;
    __int64 originate_timestamp;
    __int64 receive_timestamp;
    int transmit_timestamp_seconds;
    int transmit_timestamp_fractions;
};

#endif
