1,317
社区成员
发帖
与我相关
我的任务
分享
// 接收消息
int ReadFrom(char FAR * cp, unsigned short &nPort, char FAR * pBuf, unsigned int len)
{
// addr用于取得客户端的地址信息
SOCKADDR_IN addr;
int nLen = sizeof(addr);
int currlen = 0;
if ( len > 0 )
{
int bytes = ::recvfrom( m_hSocket, pBuf, len, 0, (struct sockaddr*)&addr, &nLen );
if ( bytes > 0 )
{
currlen += bytes;
char * p = inet_ntoa(addr.sin_addr);
memcpy(cp, p, strlen(p));
cp[strlen(p)] = 0;
//strcat(cp, p);
nPort = ntohs(addr.sin_port);
// 缓存中没有数据
#ifdef WIN32
}else if ( bytes < 0 && ::WSAGetLastError() != WSAEWOULDBLOCK )
{
; // break;
#else // linux or unix
}else if ( bytes < 0 && (errno == EWOULDBLOCK || errno == EAGAIN) )
{
;// break;
#endif
}else if ( bytes < 0 ) // 套接字错误
{
return -1;
}else if ( bytes == 0 ) // 连接已断开
{
return 0;
}
}
*(pBuf+currlen) = 0;
++currlen;
return currlen;
}
// 发送消息
int SendTo(const char FAR * cp, const unsigned short nPort, const char FAR * pBuf, unsigned int len)
{
struct sockaddr_in addr;
memset( &addr, 0x0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = ::inet_addr( cp );
if ( addr.sin_addr.S_un.S_addr == -1 )
{
struct hostent *pHost;
pHost = gethostbyname(cp);
if ( pHost != NULL )
{
if (pHost->h_addr == NULL )
return false;
addr.sin_addr.S_un.S_addr = ((struct in_addr*)pHost->h_addr_list[0])->S_un.S_addr;
}else
return false;
}
addr.sin_port = ::htons(nPort);
unsigned int portion_size = 0, send_size = 0;
while ( send_size < len ) // 如果发送的数据大小和实际需要发送的大小不同,则认为出现例外
{
portion_size = len - send_size;
if ( portion_size > 32768 )
portion_size = 32768;
// 发送数据
int bytes = ::sendto( m_hSocket, pBuf + send_size, portion_size, 0, (sockaddr*)&addr, sizeof(addr) );
// 当出现与Nonblocking模式有关的错误时
#ifdef EAGAIN
if ( error == EAGAIN )
return 0;
#endif
#ifdef EWOULDBLOCK
if ( error == EWOULDBLOCK )
return 0;
#endif
if ( bytes > 0 )
{
send_size += bytes;
}else if ( bytes < 0 )
{
return -1;
}else
return 0;
}
return send_size;
}