?? sock.cpp
字號(hào):
/***************************************************
中英文WordNet在線詞典
本軟件遵從LGPL協(xié)議,完全開放所以源代碼及設(shè)計(jì)文檔。
寧夏大學(xué)智能網(wǎng)格系統(tǒng)實(shí)驗(yàn)室 張冬 康彩 2005.10
****************************************************/
#include "sockcom.h"
#define MAX_LINE_SIZE 1024
/***************************************************************************************************************
sockerror 用來輸出網(wǎng)絡(luò)函數(shù)的錯(cuò)誤信息
***************************************************************************************************************/
void sockerror(const char *format, ...)
{
int errno;
va_list args;
va_start(args, format);
fprintf(stderr, format, args);
va_end(args);
errno = WSAGetLastError();
switch (errno)
{
case WSAEADDRINUSE:
fprintf(stderr,"WSAEADDRINUSE:The specified address is already in use.");
break;
case WSAEADDRNOTAVAIL:
fprintf(stderr,"WSAEADDRNOTAVAIL:The specified address is not available from the local machine.");
break;
case WSAEAFNOSUPPORT:
fprintf(stderr,"WSAEAFNOSUPPORT:Addresses in the specified family cannot be used with this socket.");
break;
case WSAECONNREFUSED:
fprintf(stderr,"WSAECONNREFUSED:The attempt to connect was forcefully rejected.");
break;
case WSAEDESTADDRREQ:
fprintf(stderr,"WSAEDESTADDRREQ:A destination address is required.");
break;
case WSAEFAULT:
fprintf(stderr,"WSAEFAULT:The lpSockAddrLen argument is incorrect.");
break;
case WSAEINVAL:
fprintf(stderr,"WSAEINVAL:The socket is already bound to an address.");
break;
case WSAEISCONN:
fprintf(stderr,"WSAEISCONN:The socket is already connected.");
break;
case WSAEMFILE:
fprintf(stderr,"WSAEMFILE:No more file descriptors are available.");
break;
case WSAENETUNREACH:
fprintf(stderr,"WSAENETUNREACH:The network cannot be reached from this host at this time.");
break;
case WSAENOBUFS:
fprintf(stderr,"WSAENOBUFS:No buffer space is available. The socket cannot be connected.");
break;
case WSAENOTCONN:
fprintf(stderr,"WSAENOTCONN:The socket is not connected.");
break;
case WSAENOTSOCK:
fprintf(stderr,"WSAENOTSOCK:The descriptor is a file, not a socket.");
break;
case WSAETIMEDOUT:
fprintf(stderr,"WSAETIMEDOUT:The attempt to connect timed out without establishing a connection. ");
break;
default:
fprintf(stderr,"WSAEError: Unknown! ");
break;
}
fprintf(stderr,"\n");
}
/***************************************************************************************************************
Constructsockaddr 用來從根據(jù)地址strAddr和端口strPort自動(dòng)構(gòu)造好一個(gè)地址機(jī)構(gòu)
他會(huì)自動(dòng)判斷strAddr是域名還是IP地址,然后進(jìn)行相應(yīng)轉(zhuǎn)換
***************************************************************************************************************/
int ConstructSockaddr(SOCKADDR_IN* paddr_in,char * strAddr,char * strPort)
{
unsigned short port;
struct hostent* phostent;
port = atoi(strPort);
if (port == 0)
return 0;
paddr_in->sin_family = AF_INET;
paddr_in->sin_port = htons(port);
paddr_in->sin_addr.s_addr = inet_addr(strAddr);
if(paddr_in->sin_addr.s_addr != INADDR_NONE)
return 1;
phostent = gethostbyname(strAddr);
if (phostent == NULL)
{
sockerror("Resove name %s error!",strAddr);
return 0;
}
paddr_in->sin_addr = *((IN_ADDR*) phostent->h_addr);
if(paddr_in->sin_addr.s_addr != INADDR_NONE)
return 1;
return 0;
}
/***************************************************************************************************************
WriteSocket 用來從網(wǎng)絡(luò)中寫n個(gè)字節(jié)
***************************************************************************************************************/
int WriteSocket(SOCKET s,char FAR *buf,int n)
{
int count = 0;
int sc;
while(count < n)
{
sc = send(s,buf + count,n - count,0);
if(sc < 0)
return sc;
if(sc == 0)
Sleep(100);
count += sc;
}
return count;
}
void InitBufferSocket(BufferSocket* pSock)
{
pSock->ReadCount = 0;
}
/***************************************************************************************************************
readline 用來從網(wǎng)絡(luò)中讀取一行,先將數(shù)據(jù)讀取到Buffer中,再從Buffer中讀取一行
***************************************************************************************************************/
int ReadCharFromBufferSocket(BufferSocket* pSock,char *ptr)
{
if(pSock->ReadCount <= 0)
{
pSock->ReadCount = recv(pSock->Socket,pSock->ReadBuf,MAX_LINE_SIZE,0);
if(pSock->ReadCount <= 0) // EOF or SOCKET_ERROR
return pSock->ReadCount;
pSock->ReadPtr = pSock->ReadBuf;
}
pSock->ReadCount--;
*ptr = *pSock->ReadPtr++;
return 1;
}
/***************************************************************************************************************
readline 用來從網(wǎng)絡(luò)中讀取一行,先將數(shù)據(jù)讀取到Buffer中,再從Buffer中讀取一行
***************************************************************************************************************/
int ReadLineFromBufferSocket(BufferSocket* pSock,char* szBuf,int nBufSize)
{
char c,*ptr;
int n,rc;
ptr = szBuf;
for(n = 1;n < nBufSize;n++)
{
rc = ReadCharFromBufferSocket(pSock,&c);
if(rc == 1)
{
*ptr++ = c;
if(c == '\n')
break;
}
else // EOF or SOCKET_ERROR
{
if(n==1) // no data read
return 0;
else
break;
}
}
ptr--;
*ptr = '\0';
return n;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -