技术开发 频道

 setsockopt用法浅析

 10.还一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:

 (前不久做过这个函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的

 具体协议,以及出错的代码都可以记录下来)

 BOOL bDebug=TRUE;

 setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));

 11.附加:往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,

 我的习惯是自己写个处理网络缓冲的类,动态分配内存;下面我将这个类写出,希望对

 初学者有所帮助:

//仿照String 改写而成

 //==============================================================================

 // 二进制数据,主要用于收发网络缓冲区的数据

 // CNetIOBuffer 以 MFC 类 CString 的源代码作为蓝本改写而成,用法与 CString 类似,

 // 但是 CNetIOBuffer 中存放的是纯粹的二进制数据,'\0' 并不作为它的结束标志。

 // 其数据长度可以通过 GetLength() 获得,缓冲区地址可以通过运算符 LPBYTE 获得。

 //==============================================================================

 // Copyright (c) All-Vision Corporation. All rights reserved.

 // Module: NetObject

 // File: SimpleIOBuffer.h

 // Author: gdy119

 // Email : 8751webmaster@126.com

 // Date: 2004.11.26

 //==============================================================================

 // NetIOBuffer.h

 #ifndef _NETIOBUFFER_H

 #define _NETIOBUFFER_H

 //=============================================================================

 #define MAX_BUFFER_LENGTH 1024*1024

 //=============================================================================

 //主要用来处理网络缓冲的数据

 class CNetIOBuffer

 {

 protected:

 LPBYTE m_pbinData;

 int m_nLength;

 int m_nTotalLength;

 CRITICAL_SECTIONm_cs;

 void Initvalibers();

 public:

 CNetIOBuffer();

 CNetIOBuffer(const LPBYTE lbbyte, int nLength);

 CNetIOBuffer(const CNetIOBuffer&binarySrc);

 virtual ~CNetIOBuffer();

 //=============================================================================

 BOOL CopyData(const LPBYTE lbbyte, int nLength);

 BOOL ConcatData(const LPBYTE lbbyte, int nLength);

 void ResetIoBuffer();

 int GetLength() const;

 BOOL SetLength(int nLen);

 LPBYTE GetCurPos();

 int GetRemainLen();

 BOOL IsEmpty() const;

 operator LPBYTE() const;

 static GetMaxLength() { return MAX_BUFFER_LENGTH; }

 const CNetIOBuffer& operator=(const CNetIOBuffer& buffSrc);

 };

 #endif //

 // NetOBuffer.cpp: implementation of the CNetIOBuffer class.

 //======================================================================

 #include "stdafx.h"

 #include "NetIOBuffer.h"

 //======================================================================

 //=======================================================================

 // Construction/Destruction

 CNetIOBuffer::CNetIOBuffer()

 {

 Initvalibers();

 }

 CNetIOBuffer::CNetIOBuffer(const LPBYTE lbbyte, int nLength)

 {

 Initvalibers();

 CopyData(lbbyte, nLength);

 }

 CNetIOBuffer::~CNetIOBuffer()

 {

 delete []m_pbinData;

 m_pbinData=NULL;

 DeleteCriticalSection(&m_cs);

 }

 CNetIOBuffer::CNetIOBuffer(const CNetIOBuffer&binarySrc)

 {

 Initvalibers();

 CopyData(binarySrc,binarySrc.GetLength());

 }

 void CNetIOBuffer::Initvalibers()

 {

 m_pbinData = NULL;

 m_nLength = 0;

 m_nTotalLength = MAX_BUFFER_LENGTH;

 if(m_pbinData==NULL)

 {

 m_pbinData=new BYTE[m_nTotalLength];

 ASSERT(m_pbinData!=NULL);

 }

 InitializeCriticalSection(&m_cs);

 }

 void CNetIOBuffer::ResetIoBuffer()

 {

 EnterCriticalSection(&m_cs);

 m_nLength = 0;

 memset(m_pbinData,0,m_nTotalLength);

 LeaveCriticalSection(&m_cs);

 }

 BOOL CNetIOBuffer::CopyData(const LPBYTE lbbyte, int nLength)

 {

 if( nLength > MAX_BUFFER_LENGTH )

 return FALSE;

 ResetIoBuffer();

 EnterCriticalSection(&m_cs);

 memcpy(m_pbinData, lbbyte, nLength );

 m_nLength = nLength;

 LeaveCriticalSection(&m_cs);

 return TRUE;

 }

 BOOL CNetIOBuffer::ConcatData(const LPBYTE lbbyte, int nLength)

 {

 if( m_nLength + nLength > MAX_BUFFER_LENGTH )

 return FALSE;

 EnterCriticalSection(&m_cs);

 memcpy(m_pbinData+m_nLength, lbbyte, nLength );

 m_nLength += nLength;

 LeaveCriticalSection(&m_cs);

 return TRUE;

 }

 int CNetIOBuffer::GetLength() const

 {

 return m_nLength;

 }

 BOOL CNetIOBuffer::SetLength(int nLen)

 {

 if( nLen > MAX_BUFFER_LENGTH )

 return FALSE;

 EnterCriticalSection(&m_cs);

 m_nLength = nLen;

 LeaveCriticalSection(&m_cs);

 return TRUE;

 }

 LPBYTE CNetIOBuffer::GetCurPos()

 {

 if( m_nLength < MAX_BUFFER_LENGTH )

 return (m_pbinData+m_nLength);

 else

 return NULL;

 }

 CNetIOBuffer:: operator LPBYTE() const

 {

 return m_pbinData;

 }

 int CNetIOBuffer::GetRemainLen()

 {

 return MAX_BUFFER_LENGTH - m_nLength;

 }

 BOOL CNetIOBuffer::IsEmpty() const

 {

 return m_nLength == 0;

 }

 const CNetIOBuffer& CNetIOBuffer:: operator=(const CNetIOBuffer& buffSrc)

 {

 if(&buffSrc!=this)

 {

 CopyData(buffSrc, buffSrc.GetLength());

 }

 return *this;

 }
 

 查看原文地址

0
相关文章