📄 udpsocket.cpp
字号:
#include "StdAfx.h"
#include "udpsocket.h"
CUDPSocket::CUDPSocket(void):_socket(INVALID_SOCKET)
{
}
CUDPSocket::~CUDPSocket(void)
{
Delete();
}
bool CUDPSocket::Create(CString strHost,UINT nPort)
{
WSADATA wsad;
::WSAStartup(MAKEWORD(2,2),&wsad);
/* 解析主机名字 */
hostent* host_ent;
if( ( host_ent = ::gethostbyname(strHost)) == NULL) {
if( ::inet_addr(strHost) == INADDR_NONE ){
_socket = INVALID_SOCKET;
return false;
}
}else {
in_addr* addr_ptr = (in_addr *) *host_ent->h_addr_list ;
strHost = inet_ntoa(*addr_ptr) ;
}
memset( &_ServerAddr, 0, sizeof( _ServerAddr ) ) ;
_ServerAddr.sin_family = AF_INET ;
_ServerAddr.sin_addr.s_addr = inet_addr( strHost ) ;
_ServerAddr.sin_port = htons( nPort ) ;
/* 建立socket并绑定端口 */
if( (_socket = ::socket(AF_INET,SOCK_DGRAM,0) ) != INVALID_SOCKET ){
sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(0);
if( ::bind(_socket,(sockaddr *)&addr,sizeof(addr)) == 0 ){
return true;
}else {
// int err = ::WSAGetLastError();
::closesocket(_socket);
_socket = INVALID_SOCKET;
}
}
_socket = INVALID_SOCKET;
return false;
}
bool CUDPSocket::Delete()
{
if( Valid() ){
::closesocket(_socket);
_socket = INVALID_SOCKET;
}
return true;
}
int CUDPSocket::SendTo(const char* buf,int len)
{
if( Valid() ){
return ::sendto(_socket,buf,len,0,(sockaddr*)&_ServerAddr,sizeof(_ServerAddr));
}
return 0;
}
bool CUDPSocket::Valid()
{
return (_socket != INVALID_SOCKET);
}
int CUDPSocket::RecvFrom(char* buf,int len)
{
if( Valid() ){
sockaddr_in addr;
int addrlen=sizeof(addr);
int nrecved = ::recvfrom(_socket,buf,len,0,(sockaddr *)&addr,&addrlen);
if( nrecved > 0 ){
return nrecved; // 正常
}
if( ::WSAGetLastError() == WSAECONNRESET ){
Delete(); // 对方已经断开,这边也断了吧
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -