?? tcplib.cpp
字號:
/***************************************** file : TcpLib.cpp writer: linsh date: 2004-07-23 content: tcp client and server class *****************************************/#include "stdafx.h"#include "TcpLib.h"#include <io.h>
#include <Winsock2.h>
#include <stdlib.h>
extern int errno;
CTcpClient::CTcpClient(){ rCommFunc_.OnRecvData = NULL; rCommFunc_.OnConnected = NULL; rCommFunc_.OnDisconnected = NULL; sock = -1; FD_ZERO(&m_readset);}CTcpClient::~CTcpClient(){ if(sock > 0) closesocket(sock);}int CTcpClient::InitClient(char *ip, int port){ struct sockaddr_in dest; strncpy(m_sdistIp,ip,16); m_port = port;
sock = socket(PF_INET,SOCK_STREAM,0); if(sock < 0)
{
int err = WSAGetLastError();
return -1; } memset(&dest,0, sizeof(dest)); dest.sin_family = PF_INET; dest.sin_port = htons(port); dest.sin_addr.S_un.S_addr = inet_addr(ip); if(0 != connect(sock, (sockaddr *)&dest, sizeof(dest))) { closesocket(sock); sock = -1; return -1; }
unsigned long flag = 0;
int ret = ioctlsocket(sock,FIONBIO,&flag);
if(ret != 0)
{
closesocket(sock);
sock = -1;
return -1;
} if(rCommFunc_.OnConnected != NULL) rCommFunc_.OnConnected(sock,ip,port); return sock;}int CTcpClient::SendMsg(int sock,char * sBuf,int nLen){ int ret = send(sock,sBuf,nLen,MSG_DONTROUTE);
if(ret == nLen)
return 0;
else
{
if(rCommFunc_.OnDisconnected)
rCommFunc_.OnDisconnected(sock,m_sdistIp,m_port);
closesocket(sock);
sock = -1;
return 104;
}
}void CTcpClient::RunClient(){ int nLen; struct timeval timeout = {0,0}; FD_ZERO(&m_readset); FD_SET((unsigned int)sock, &m_readset); if(select(sock + 1, &m_readset, NULL,NULL, &timeout) > 0) { if (FD_ISSET(sock,&m_readset)) { nLen = recv(sock,m_Buf,SOCK_BUF_SIZE,0);
if(nLen > 0) { if(rCommFunc_.OnRecvData != NULL) rCommFunc_.OnRecvData(sock,m_sdistIp,m_port,m_Buf,nLen); } else { if(rCommFunc_.OnDisconnected) rCommFunc_.OnDisconnected(sock,m_sdistIp,m_port);
closesocket(sock);
sock = -1;
} } } }void CTcpClient::CloseClient(){ if(sock > 0) closesocket(sock); if(rCommFunc_.OnDisconnected) rCommFunc_.OnDisconnected(sock,m_sdistIp,m_port); sock = -1;}CTcpServer::CTcpServer(){ rCommFunc_.OnRecvData = NULL; rCommFunc_.OnConnected = NULL; rCommFunc_.OnDisconnected = NULL; FD_ZERO(&m_readset); m_srvsock = -1; m_listenport = 0; maxsock = 0; lst_clients = NULL;}CTcpServer::~CTcpServer(){ tagCliList *cr ; tagCliList *nt; cr = lst_clients; while( cr != NULL ) { nt = cr->next; if(cr->clifd > 0) closesocket(cr->clifd); delete cr; cr = nt; } lst_clients = NULL;}int CTcpServer::InitServer(int iport){ struct sockaddr_in dest; m_srvsock = socket(PF_INET, SOCK_STREAM, 0); if(m_srvsock < 0) return -1; memset(&dest,0, sizeof(dest)); dest.sin_family = PF_INET; dest.sin_port = htons(iport); dest.sin_addr.s_addr = INADDR_ANY; if(bind(m_srvsock, (struct sockaddr*)&dest, sizeof(dest)) != 0) { closesocket(m_srvsock); m_srvsock = -1; return -1; } listen(m_srvsock, 255); maxsock = maxsock>m_srvsock? maxsock:m_srvsock; unsigned long flag = 0;
int ret = ioctlsocket(m_srvsock,FIONBIO,&flag);
if(ret != 0)
{
closesocket(m_srvsock);
m_srvsock = -1;
return -1;
}
return 0;}void CTcpServer::RunServer(){ struct timeval timeout = {0,0}; FD_ZERO(&m_readset); FD_SET((unsigned int)m_srvsock, &m_readset); if(select(m_srvsock + 1, &m_readset, NULL,NULL, &timeout) > 0) { if (FD_ISSET(m_srvsock,&m_readset)) { tagCliList *cr ; struct sockaddr_in client_addr; int addrlen = sizeof(client_addr); int clientfd; clientfd = accept(m_srvsock, (struct sockaddr*)&client_addr, &addrlen); if(clientfd > 0) { cr = new tagCliList; memset(cr,0,sizeof(tagCliList)); cr->clifd = clientfd; strncpy(cr->cliIp,inet_ntoa(client_addr .sin_addr),16); cr->cliport = ntohs(client_addr.sin_port); cr->next = NULL; tagCliList **lp; for(lp = &lst_clients; (*lp) != NULL; lp = &((*lp)->next)); (*lp) = cr; (rCommFunc_.OnConnected)(cr->clifd, cr->cliIp,cr->cliport); maxsock = maxsock > cr->clifd? maxsock: cr->clifd; } } } FD_ZERO(&m_readset); tagCliList **lp; for(lp = &lst_clients; (*lp) != NULL; lp = &((*lp)->next)) if((*lp)->clifd > 0) FD_SET((unsigned int)(*lp)->clifd,&m_readset); } if(select(maxsock + 1, &m_readset, NULL,NULL, &timeout) > 0) {
lp = &lst_clients;
while((*lp) != NULL)
{
if(FD_ISSET((*lp)->clifd, &m_readset))
{
int nLen;;
nLen = recv((*lp)->clifd,m_Buf,SOCK_BUF_SIZE,0);
if(nLen > 0)
{
if(rCommFunc_.OnRecvData != NULL)
rCommFunc_.OnRecvData((*lp)->clifd,(*lp)->cliIp,(*lp)->cliport,m_Buf,nLen);
lp = &((*lp)->next);
}
else
{
if(rCommFunc_.OnDisconnected)
rCommFunc_.OnDisconnected((*lp)->clifd,(*lp)->cliIp,(*lp)->cliport);
closesocket((*lp)->clifd);
(*lp)->clifd = -1;
tagCliList *dellp;
dellp = *lp;
*lp = (*lp)->next;
delete dellp;
}
}
else
lp = &((*lp)->next);
} }}void CTcpServer::CloseServer(){ if(m_srvsock > 0) closesocket(m_srvsock); m_srvsock = -1;}int CTcpServer::SendMsg(int ihandle, char *buf, int nLen){ int ret = send(ihandle,buf,nLen,MSG_DONTROUTE);
if(ret == nLen)
return 0;
else
{
tagCliList **lp;
lp = &lst_clients;
while((*lp) != NULL)
{
if((*lp)->clifd == ihandle)
{
if(rCommFunc_.OnDisconnected)
rCommFunc_.OnDisconnected((*lp)->clifd,(*lp)->cliIp,(*lp)->cliport);
closesocket((*lp)->clifd);
(*lp)->clifd = -1;
tagCliList *dellp;
dellp = *lp;
*lp = (*lp)->next;
delete dellp;
break;
}
else
lp = &((*lp)->next);
}
return 104;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -