📄 csocket.cc
字号:
#include "CSocket.h"
Sock_instance::Sock_instance(string hostname, unsigned port, s_type type)
: _hostname( hostname ),
_port( port ),
_fd( 0 ),
_state( CONN_ERROR ),
_type( type )
{
_datalen = 0;
_data = new unsigned char[1024*1024];
}
Sock_instance::~Sock_instance()
{
delete[] _data;
}
bool Sock_instance::Connect()
{
if( _type == SERVER_TYPE )
{
cout << "The socket is a server, don't use conncet!" << endl;
return false;
}
struct sockaddr_in peer;
int fd;
bzero( &peer, sizeof(peer) );
peer.sin_family = AF_INET;
struct hostent *hp = gethostbyname( _hostname.c_str() );
if ( hp == NULL )
{
cout << "unknow host: " << _hostname << endl;
return false;
}
peer.sin_addr = *( ( struct in_addr * )hp->h_addr );
peer.sin_port = htons(_port);
cout << "conncet to " << inet_ntoa(peer.sin_addr) << ": " << ntohs( peer.sin_port ) << endl;
fd = socket( AF_INET, SOCK_STREAM, 0 );
if ( fd < 0 )
{
cout << "socket call failed" << endl;
return false;
}
if( connect( fd, (struct sockaddr *)&peer, sizeof( peer ) ) )
{
cout << errno << "connect failed" << endl;
_state = CONN_ERROR;
close( fd );
return false;
}
_state = CONN_OK;
_fd = fd;
return true;
}
s_state Sock_instance::state()
{
return _state;
}
int Sock_instance::fd()
{
return _fd;
}
bool Sock_instance::Send(string msg)
{
if( state() != CONN_OK )
{
cout << "the socket is not ok" << endl;
return false;
}
int rc;
if((rc = send(_fd, msg.c_str(), msg.size(), 0)) == -1)
{
if((errno != EWOULDBLOCK) && (errno != EAGAIN))
{
_state = CONN_ERROR;
return false;
}
}
return true;
}
int Sock_instance::Receive()
{
int rc;
char buf[BUFSIZ];
char *p_buf = buf;
static bool b_readhead = true;
bzero(buf, BUFSIZ);
if((rc = recv( _fd, buf, BUFSIZ - 1, 0 )) < 0 )
{
cout << "recive error" << endl;
_state = CONN_WAIT;
Close();
}
else if( rc == 0 )
{
cout << "server teminated" << endl;
_state = CONN_WAIT;
Close();
}
else
{
//read HTTP head
int ix = 0;
while( b_readhead )
{
// 2 0D 0A just for head end
if( ix >= rc )
break;
if( buf[ix] == 13 && buf[ix+1] == 10 && buf[ix+2] == 13 && buf[ix+3] == 10 )
{
b_readhead = false;
char *p = new char[ix+5];
memset( p, 0, ix+5 );
memcpy( p, buf, ix+5 );
p_buf += ix + 5;
_http_head = p;
delete[] p;
cout << _http_head << endl;
break;
}
ix ++;
}
//copy data to _data
if( ix != 0 && ix < rc )
{
//this buf has head so data begin with buf+ix+4
memcpy( _data+_datalen, buf+ix+4, rc-ix-4 );
_datalen += rc-ix-4;
}
else
{
memcpy( _data+_datalen, buf, rc );
_datalen += rc;
}
}
return rc;
}
inline void Sock_instance::Close()
{
close( _fd );
}
//string Sock_instance::data() const
unsigned char * Sock_instance::data() const
{
return _data;
}
int Sock_instance::datalen() const
{
return _datalen;
}
string Sock_instance::http_head() const
{
return _http_head;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -