www.pudn.com > doc2pdf-0_7_1.rar > doc2pdf_io.cpp
///////////////////////////////////////////////////////////////////////////// // // Project: Doc2pdf // // File: doc2pdf_io.cpp // // Author(s): Matt Peterson// // Description: IO class that implement the doc2pdf IO interface // ///////////////////////////////////////////////////////////////////////////// #include "doc2pdf_io.h" // Constructor Doc2pdfSocket::Doc2pdfSocket() { m_Sock = -1; } // Destructor Doc2pdfSocket::~Doc2pdfSocket() { Close(); } // Connects to a host. Returns zero on success, WSAError on failure int Doc2pdfSocket::Connect(const CString& host, unsigned short port) { struct hostent* he; struct sockaddr_in peeraddr; // Create socket if necessary if(m_Sock == -1) { m_Sock = socket(AF_INET,SOCK_STREAM,0); if(m_Sock == -1) { return WSAGetLastError(); } } // resolve host to address he = gethostbyname((LPCSTR)host); if(he == NULL) { return WSAEINVAL; } // connnect memset(&peeraddr,0,sizeof(struct sockaddr_in)); peeraddr.sin_family=AF_INET; peeraddr.sin_port=htons(port); peeraddr.sin_addr.s_addr = *((unsigned long*)he->h_addr); if(connect(m_Sock,(struct sockaddr*)&peeraddr,sizeof(sockaddr_in)) != 0) { return WSAGetLastError(); } return 0; } // Writes a line. Returns zero on success, WSAError on failure int Doc2pdfSocket::WriteLine(const CString& line) { return WriteLine((LPCSTR)line); } // Writes a line. Returns zero on success, WSAError on failure int Doc2pdfSocket::WriteLine(LPCSTR line) { char crlf[2] = {'\r','\n'}; if(send(m_Sock,line,strlen(line), 0) == SOCKET_ERROR) { return WSAGetLastError(); } if(send(m_Sock,crlf,2, 0) == SOCKET_ERROR) { return WSAGetLastError(); } return 0; } // Writes a buffer int Doc2pdfSocket::Write(void* buf, int bufsize) { if(send(m_Sock,(const char*) buf,bufsize,0) == SOCKET_ERROR) { return WSAGetLastError(); } return 0; } // Reads a line. Returns zero on success, WSAError on failure int Doc2pdfSocket::ReadLine(CString& line) { CHAR l[81]; CHAR* lf; CHAR* c; BOOL end; int bytesread; fd_set readfds; struct timeval timeout; line.Empty(); end = FALSE; do { timeout.tv_sec = MAX_IO_WAIT; timeout.tv_usec = 0; FD_ZERO(&readfds); FD_SET(m_Sock,&readfds); if(select(m_Sock + 1, &readfds,NULL,NULL,&timeout) <= 0) { return 1; } bytesread = recv(m_Sock,l,80,MSG_PEEK); if(bytesread > 1) { /* c = l; for(i=0;i 0) { closesocket(m_Sock); m_Sock=-1; } return 0; }