⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w32sock.h

📁 c-smile 一个语法类似与JS 又有点像C++的 编译器
💻 H
字号:
//-< W32SOCK.H >-----------------------------------------------------*--------*
// SAL                       Version 1.0         (c) 1997  GARRET    *     ?  *
// (System Abstraction Layer)                                        *   /\|  *
//                                                                   *  /  \  *
//                          Created:      8-May-97    K.A. Knizhnik  * / [] \ *
//                          Last update: 21-Nov-98    K.A. Knizhnik  * GARRET *
//-------------------------------------------------------------------*--------*
// Windows sockets  
//-------------------------------------------------------------------*--------*

#ifndef __W32SOCK_H__
#define __W32SOCK_H__

#include "sockio.h"
#include "winsock2.h"

namespace sal {

class win_socket : public socket_t { 
  protected: 
    SOCKET        s; 
    int           errcode;  // error code of last failed operation 
    char*         _address; // host address
    int           _port;    // port
    char*         r_address; 
    int           r_port; 

    enum error_codes { 
	ok = 0,
	not_opened = -1,
	bad_address = -2,
	connection_failed = -3,
	broken_pipe = -4, 
	invalid_access_mode = -5
    };

  public: 
    boolean   open(int listen_queue_size);
    boolean   connect(int max_attempts, time_t timeout);

    int       read(void* buf, size_t min_size, size_t max_size,time_t timeout);
    boolean   read(void* buf, size_t size,size_t *size_read = 0);
    boolean   write(void const* buf, size_t size);

    virtual const char *addr() const { return _address; };
    virtual int         port() const { return _port; };
    virtual const char *remote_addr() const { return r_address; };
    virtual int         remote_port() const { return r_port; };

    boolean   is_ok(); 
    boolean   close();
    boolean   shutdown();
    void      get_error_text(char* buf, size_t buf_size);

    socket_t* accept();
    boolean   cancel_accept();

    win_socket(const char* address); 
    win_socket(SOCKET new_sock);

    ~win_socket();
};

#define SOCKET_BUF_SIZE (8*1024) 
#define ACCEPT_TIMEOUT  (30*1000)

class local_win_socket : public socket_t { 
  protected: 
    enum error_codes { 
	ok = 0,
	not_opened = -1,
	broken_pipe = -2,
	timeout_expired = -3
    };
    enum socket_signals {
        RD,  // receive data
	RTR, // ready to receive
        TD,  // transfer data
	RTT  // ready to transfer
    };
    //------------------------------------------------------
    // Mapping between signals at opposite ends of socket:
    // TD  ---> RD
    // RTR ---> RTT
    //------------------------------------------------------

    struct socket_buf { 
        volatile int RcvWaitFlag;
        volatile int SndWaitFlag;
	volatile int DataEnd;
	volatile int DataBeg;
	char Data[SOCKET_BUF_SIZE - 4*sizeof(int)];  
    };
    struct accept_data { 
        HANDLE Signal[4];
	HANDLE BufHnd;
    };
    struct connect_data { 
	HANDLE Mutex;
	int    Pid;
    };
    socket_buf* RcvBuf;
    socket_buf* SndBuf;
    HANDLE      Signal[4];	   
    HANDLE      Mutex;
    HANDLE      BufHnd;
    int         Error;
    char*       Name;

  public: 
    virtual const char *addr() const { return Name; };
    virtual int         port() const { return 0; };
    virtual const char *remote_addr() const { return ""; };
    virtual int         remote_port() const { return 0; };

    boolean   open(int listen_queue_size);
    boolean   connect(int max_attempts, time_t timeout);

    int       read(void* buf, size_t min_size, size_t max_size,time_t timeout);
    boolean   read(void* buf, size_t size, size_t *size_read = 0);
    boolean   write(void const* buf, size_t size);

    boolean   is_ok(); 
    boolean   close();
    boolean   shutdown();
    void      get_error_text(char* buf, size_t buf_size);

    socket_t* accept();
    boolean   cancel_accept();
    
    local_win_socket(const char* address); 
    local_win_socket(); 

    ~local_win_socket();
};

};
	   
#endif





⌨️ 快捷键说明

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