惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Y
Y Combinator Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
博客园_首页
小众软件
小众软件
I
InfoQ
J
Java Code Geeks
月光博客
月光博客
S
Secure Thoughts
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Stack Overflow Blog
Stack Overflow Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Latest news
Latest news
G
GRAHAM CLULEY
IT之家
IT之家
C
Cisco Blogs
Last Week in AI
Last Week in AI
Engineering at Meta
Engineering at Meta
L
LangChain Blog
The Register - Security
The Register - Security
SecWiki News
SecWiki News
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
T
Tenable Blog
博客园 - Franky
美团技术团队
I
Intezer
U
Unit 42
雷峰网
雷峰网
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
SegmentFault 最新的问题
C
Cyber Attacks, Cyber Crime and Cyber Security

博客园 - .net技術

makefile c语言难点 线程同步(转) stl学习(转帖2) stl 学习(转帖) visual C++ 6.0开发工具与调试 vc动态装载动态库 详细的MySQL C API CString,string,char*的综合比较 在Linux下安装和使用MySQL 人际关系的55个绝招 一个linux下c++程序 一个网络扫描程序 VC数字图像处理编程 ASCII 一些函数 防盗链IHttpHandler(转自垃圾猪) 按比例显示图片大小 回车改变焦点
一个封装的socket类
.net技術 · 2006-06-16 · via 博客园 - .net技術


#include 
"stdafx.h"
#include 
"libyfun.h"
#include 
"mytcp.h"
//#include "ty_server.h"//构造函数
myCTcp::myCTcp ()
{
    m_timeout 
= 3000;
    m_nSock 
= -1;
    WSADATA sockData;
    
if (WSAStartup (MAKEWORD (22), &sockData))
    {
        printf(
"TCP加载失败\n");
        exit (
0);
    }
}
//析构函数
myCTcp::~myCTcp ()
{
    Close ();
    WSACleanup ();
}
/*赋值
  入参:nSockfd - socket句柄
  出参:赋值后的socket句柄
*/
int myCTcp::operator = (int nSockfd)
{
    assert ((m_nSock 
== -1&& (nSockfd > -1));
    m_nSock 
= nSockfd;return m_nSock;
}
/*取出socket句柄
  入参:无
  出参:取出的socket句柄
*/
int myCTcp::GetHandle () const
{
    
return m_nSock;
}
/*创建socket
  入参:无
  出参:1: 成功 ; 0: 失败
*/
int myCTcp::Open ()
{
    assert (m_nSock 
== -1);if(m_nSock != -1)
        Close ();

    m_nSock 

= socket (AF_INET, SOCK_STREAM, 0);

    setsockopt (m_nSock, SOL_SOCKET, SO_SNDTIMEO, (

char *)&m_timeout, sizeof(m_timeout));

    setsockopt (m_nSock, SOL_SOCKET, SO_RCVTIMEO, (

char *)&m_timeout, sizeof(m_timeout));return (m_nSock != -1);
}
/*关闭socket
  入参:无
  出参:1: 成功 ; 0: 失败
*/
int myCTcp::Close ()
{
    
if (m_nSock != -1)
    {
        
if(closesocket (m_nSock) != 0)
        {
            
int err = WSAGetLastError();
//            DEBUG (gbl.is_debug, gbl.debug_level, gbl.log_file, "WSAGetLastError %d", err);
        }

        m_nSock 

= -1;    
    }
    
return 1;
}
/*连接
  入参:pHost - IP地址或主机名
      nPort - 端口
  出参:1: 成功 ; 0: 失败
*/
int myCTcp::Connect (const char *pHost, int nPort) const
{
    assert ((m_nSock 
!= -1&& pHost && (nPort > 0));
    
struct sockaddr_in addr;
    
struct hostent *phe = NULL;

    memset (

&addr, 0sizeof (addr));
    addr.sin_family 
= AF_INET;
    addr.sin_port 
= htons (nPort);if ((addr.sin_addr.s_addr = inet_addr (pHost)) == (unsigned long int-1)
    {
        
if ((phe = gethostbyname (pHost)) == NULL)
            
return 0;

        memcpy ((

char *)&addr.sin_addr, phe->h_addr, phe->h_length);
    }
return (connect (m_nSock, (struct sockaddr *)&addr, sizeof (addr)) == 0);
}
/*绑定
  入参:pIP - IP地址
      nPort - 端口
  出参:1: 成功 ; 0: 失败
*/
int myCTcp::Bind (const char *pIP, int nPort) const
{
    assert ((m_nSock 
!= -1&& (nPort > 0));
    
struct sockaddr_in addr;
    
struct hostent *phe = NULL;
    
int opt=1;if (setsockopt (m_nSock, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof(int)) == -1)
    {    
        
return 0;
    }

    memset (

&addr, 0sizeof (addr));
    addr.sin_family 
= AF_INET;
    addr.sin_port 
= htons (nPort);if (!pIP)
    {
        addr.sin_addr.s_addr 
= htonl (INADDR_ANY);
    }
    
else
    {
        
if ((addr.sin_addr.s_addr = inet_addr (pIP)) == (unsigned long int-1)
        {
            
if ((phe = gethostbyname (pIP)) == NULL)
                
return 0;

            memcpy ((

char *)&addr.sin_addr, phe->h_addr, phe->h_length);
        }
    }
return (bind (m_nSock, (struct sockaddr *)&addr, sizeof (addr)) == 0);
}
/*监听
  入参:nNum - 监听数目
  出参:1: 成功 ; 0: 失败
*/
int myCTcp::Listen (int nNum) const
{
    assert ((m_nSock 
!= -1&& (nNum > 0));return (listen (m_nSock, nNum) == 0);
}
/*接受连接
  入参:无
  出参:其他: 连接套接字句柄 ; -1: 失败
*/
int myCTcp::Accept () const
{
    assert (m_nSock 
!= -1);return (accept (m_nSock, (struct sockaddr *)NULL, NULL));
}
/*发送指定数目数据
  入参:pBuf - 发送缓存
      nCount - 需发送字节数
      nMicsec - socket超时值,单位:微妙,缺省:500000微妙
  出参:实际发送字节数 ,如果发送失败,返回负数
*/
int myCTcp::Sendn (const void *pBuf, int nCount, int nMicsec) const
{
    assert ((m_nSock 
!= -1&& pBuf && (nCount > 0));
    
int nLeft = nCount, nWritten = 0;
    
const char *ptr = (const char *)pBuf;
    
    
while (nLeft > 0)
    {
        
if ((nWritten = send (m_nSock, ptr, nLeft, 0)) <= 0)
        {
            
return MY_SOCK_ERROR;
        }

        nLeft 

-= nWritten;
        ptr 
+= nWritten;
    }
return nCount;
}
/*接收指定数目数据
  入参:pBuf - 接收缓存
      nCount - 需接收字节数
      nMicsec - socket超时值,单位:微妙,缺省:500000微妙
  出参:实际接收字节数 ,如果接收失败,返回负数,如果对方关闭,返回0
*/
int myCTcp::Recvn (void *pBuf, int nCount, int nMicsec) const
{
     assert ((m_nSock 
!= -1&& pBuf && (nCount > 0));
    
int nLeft = nCount, nRead = 0;
    
char *ptr = (char *)pBuf;while (nLeft > 0)
    {
        
if ((nRead = recv (m_nSock, ptr, nLeft, 0)) < 0)
        {
            
return MY_SOCK_ERROR;
        }
        
else if (nRead == 0)
        {
            
return 0;
        }

        nLeft 

-= nRead;
        ptr 
+= nRead;
    }
return nCount;
}
/*设置地址可重用
  入参:无
  出参:1: 成功 ; 0: 失败
*/
int myCTcp::SetReuseAddr ()
{
    assert (m_nSock 
!= -1);
    
int opt = 1;
    
    
if (setsockopt (m_nSock, SOL_SOCKET, SO_REUSEADDR, (const char *)&opt, sizeof(int)) == -1)
    {
        
return 0;
    }
    
    
return 1;
}