stdafx.cpp

来自「A test program ok? Very good for many be」· C++ 代码 · 共 112 行

CPP
112
字号
// stdafx.cpp : source file that includes just the standard includes
//	Tst080110.pch will be the pre-compiled header
//	stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"


int CltConnect(string strSvrAddr, unsigned short nPort)
{
    struct sockaddr_in stSvrAddr;
    int iSockClt = socket(AF_INET, SOCK_STREAM, 0);
	//struct timeval stTimeval;
	int iRet = 0;
    
    if (-1 == iSockClt)
    {
        //cerr << "socekt fail, error=[" << errno << ", " << strerror(errno) 
	//		<< "], ln=" << __LINE__ << endl;
	    //TRACE("errno=%d, \"%s\"", errno, strerror(errno));
	    TRACE("errno=%d\n", WSAGetLastError());
        return -1;        
    }
    
	/*//set timed out
	memset(&stTimeval, 0, sizeof(struct timeval));
	stTimeval.tv_sec = 2; stTimeval.tv_usec = 0;
	SetNonBlock(iSock);
	*/
	
    memset(&stSvrAddr, 0, sizeof(struct sockaddr_in));
    stSvrAddr.sin_family = AF_INET;
    stSvrAddr.sin_port = htons(nPort);
    stSvrAddr.sin_addr.s_addr = inet_addr(strSvrAddr.c_str());
	iRet = connect(iSockClt, (struct sockaddr*)&stSvrAddr, sizeof(struct sockaddr_in));
	if (0 != iRet)
    {
        cerr << "connect fail, error=[" << errno << ", " << strerror(errno) 
			<< "], ln=" << __LINE__ << endl;
        closesocket(iSockClt);
        return -1;
    }
    
    return iSockClt;
}

//持续读入, 直到读到指定字节数为止, 或中途出错返回
//参数: pszBuf-缓冲区首地址, uLen-一次性读入多少字节内容, iRead-实际读入的字节数
//返回值: -1-出错, 0-成功
int RecvOnEnd(int iSock, char *pszBuf, size_t uLen, size_t& uRead)
{
	ssize_t iRet = 0;
	size_t uOffset = 0;
    
	if (NULL == pszBuf)
	{       
		return -1;  
	}
	
	while (uOffset < uLen)
	{   
		iRet = recv(iSock, pszBuf+uOffset, uLen-uOffset, 0);
		if (0 > iRet)
		{       
			cerr << "recv error=" << errno << ", " << strerror(errno) << ", " << "ln=" << __LINE__ << endl;         
			if (EINTR == errno)
			{
				continue;
			}
			return -1;
		}
		if (0 == iRet)
		{
			cerr << "Peer closed connection, ln=" << __LINE__ << endl;
			//closesocket(iSock);      
			return -1;
		}
		uOffset += iRet;
	}
    
	uRead = uOffset ;
    
	return 0;   
}

//持续发送, 直到发送到指定字节数为止, 或中途出错返回
//参数: pszBuf-缓冲区首地址, uLen-一次性发送多少字节内容, uSend-实际发送的字节数
//返回值: -1-出错, 0-成功
int SendOnEnd(int iSock, const char* pszBuf, size_t uLen, size_t& uSend)
{
    ssize_t iRet = 0;
    size_t uOffset = 0;
    
    if (NULL == pszBuf)
    {
        return -1;  
    }
    
    while (uOffset < uLen)
    {
        iRet = send(iSock, pszBuf+uOffset, uLen-uOffset, 0);
        if (0 >= iRet)
        {
            cerr << "send fail, error=[" << errno << ", " << strerror(errno) << "], ln=" << __LINE__ << endl;
            return -1;
        }
        uOffset += iRet;
    }
    
    uSend = uOffset;
    
    return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?