/*----------------------------------------------------------------------------*/ BOOL SendDataEDI(int cSock, char* sMsgCls) /*----------------------------------------------------------------------------*/ { BOOL flag = TRUE; if (flag) { pLine = (MSG_LINE*) &sSendEdiLine; if (flag) { /* * 송신길이를 구한다. */ iSendEdiLen = sizeof(MSG_HDR) + strlen(sDataLine); /* * 송신전문을 세팅한다. */ sprintf(sSendEdiLine, "%04d%3.3s%04d%2.2s%4.4s%1.1s%1.1s%-8.8s%3.3s%s" , iSendEdiLen - 4 , "EFT" , iSendEdiLen - 4 , "02" , sMsgCls , "S" , "C" , sFileId , "000" , sDataLine); if (!flag) LOG(_FL_, 0, 0, "[SendDataEDI]...[%s] ", sSendEdiLine); } if (flag) { /* * 송신한다. : MSG_HDR + sDataLine -> */ int ret = SockSend(cSock, sSendEdiLine, iSendEdiLen); if (ret <= 0) { CSockFDCLR(cSock); return FALSE; } if (flag) { LOG(_FL_, 0, 0, "SEND(%d): EDI_HDR+DATA [%*.*s][%s]" , cSock, sizeof(MSG_HDR), sizeof(MSG_HDR), (char*)&pLine->stHdr , sDataLine); } } } return TRUE; }
int SSClient::SendMsg( Packet & packet ) { DataBuffer * buff = packet.GetBuffer(); int iRet = SockSend( buff->GetReadPtr(), buff->GetDataSize()); if(iRet < 0) return -1; return 0; }
bool GetUrlFileSize(LPCSTR host, USHORT port, LPCSTR obj, unsigned long &FileSize, CString cookie) { SOCKADDR_IN sin; SOCKET sock = INVALID_SOCKET; CString csHead, tmp; int err; char bBuf[MAX_BUFFER_SIZE] = {0}; int cbBuf = MAX_BUFFER_SIZE; int cbRead = 0; bool result = false; SockGetAddr(host, port, sin); sock = INVALID_SOCKET; sock = SockConnect((LPSOCKADDR)&sin, REGULAR_CONN_TIMEOUT); if (sock != INVALID_SOCKET) { tmp.Format(HTTP_RANGE1, 0, 1); //only first 1 byte for test if (cookie != "") { csHead.Format(HTTP_HEADER, obj, host, tmp, USER_AGENT, host, "Cookie: ", cookie); } else { csHead.Format(HTTP_HEADER, obj, host, tmp, USER_AGENT, host, "", ""); } SockSend(sock, csHead, csHead.GetLength(), err); if (SockReadable(sock, REGULAR_CONN_TIMEOUT * 2)) { memset(bBuf, 0, cbBuf); cbRead = recv(sock, bBuf, cbBuf, 0); if(cbRead > 0) { if(strstr(bBuf, "HTTP/1.1 206") && strstr(bBuf, "\r\n\r\n")) { char *p = strstr(bBuf, "Content-Range: bytes "); if (p) { p += strlen("Content-Range: bytes 0-1/"); sscanf(p, "%d", &FileSize); result = true; } } else { //LOG_ERR("GetUrlFileSize Error: obj=%s recvsize=%d.", obj, cbRead); } } else { //LOG_ERR("GetUrlFileSize recv Error: obj=%s", obj); } } closesocket(sock); } else { //LOG_ERR("GetUrlFileSize sockconnect error."); } return result; }
static int SockProc(Ns_DriverCmd cmd, Ns_Sock *sock, struct iovec *bufs, int nbufs) { int n; switch (cmd) { case DriverRecv: n = SockRecv(sock->sock, bufs, nbufs); if (n < 0 && ns_sockerrno == EWOULDBLOCK && Ns_SockWait(sock->sock, NS_SOCK_READ, sock->driver->recvwait) == NS_OK) { n = SockRecv(sock->sock, bufs, nbufs); } break; case DriverSend: n = SockSend(sock->sock, bufs, nbufs); if (n < 0 && ns_sockerrno == EWOULDBLOCK && Ns_SockWait(sock->sock, NS_SOCK_WRITE, sock->driver->sendwait) == NS_OK) { n = SockSend(sock->sock, bufs, nbufs); } break; case DriverKeep: case DriverClose: /* NB: Nothing to do. */ n = 0; break; default: /* Unsupported command. */ n = -1; break; } return n; }
BOOL GetNetworkTime() { SOCKADDR_IN sin; SOCKET sock = INVALID_SOCKET; CString csHead, tmp; CBuffer reqBuf, respBuf; int err;//, len = 0; char bBuf[MAX_BUFFER_SIZE] = {0}; int cbBuf = MAX_BUFFER_SIZE; int cbRead = 0; BOOL re = false; //nTodayDay=10;return TRUE; SockGetAddr(option.time_server, 80, sin); sock = INVALID_SOCKET; sock = SockConnect((LPSOCKADDR)&sin, REGULAR_CONN_TIMEOUT); if (sock != INVALID_SOCKET) { csHead.Format(HTTP_HEADER, "/", option.time_server, tmp, USER_AGENT, option.time_server, "", ""); SockSend(sock, csHead, csHead.GetLength(), err); if (SockReadable(sock, REGULAR_CONN_TIMEOUT * 2)) { //get the 1st recv buf memset(bBuf, 0, cbBuf); cbRead = recv(sock, bBuf, cbBuf, 0); if(cbRead > 0) { if(strstr(bBuf, "\r\n\r\n")) { if(strstr(bBuf, "Date:")) { char *sDate = strstr(bBuf, "Date: ") + 10; if(sDate) { sscanf(sDate, "%d", &nTodayDay); nTodayDay = nTodayDay % option.link_count; re = true; } } } } } closesocket(sock); } return re; }
// // thread which handles a single http request // static int proxy_handlereq(SOCKET sock_client) { SOCKET sock_server; char buf[65536]; char header_line[1024]; char host[256]; int serverPort = 80; struct sockaddr serverSockAddr; int gotHeader = 0; int count; int Status; unsigned long nbParm = 0L; char newline = '\n'; fd_set rfds; int n, maxfd; int one = 1; buf[0] = '\0'; host[0] = '\0'; // set client socket non-blocking if ((Status = SockBlock(sock_client, 0)) < 0) { SockError("proxy_handlereq(): Failed to clear non-block mode on socket"); return 1; } // now get headers from client while ((count = proxy_sockgets(sock_client, header_line, 1024)) > 0) { gotHeader = 1; // look for 'Host:' header if (!Strnicmp(header_line, "host: ", 6)) { char *pPort; strcpy(host, header_line + 6); if ((pPort = strchr(host, ':')) != NULL) { *pPort++ = '\0'; serverPort = atoi(pPort); } } //MessageBox(0, header_line, "Req header", MB_SYSTEMMODAL); strcat(buf, header_line); strcat(buf, "\n"); } // add second line terminator to mark end of header strcat(buf, "\n"); // bail if nothing came through if (!gotHeader) { SockClose(sock_client); return 1; } // did we get a host address? if (host[0] == '\0') { char err400[] = "HTTP/1.0 400 Invalid header received from browser\n\n"; SockSend(sock_client, err400, strlen(err400)); SockClose(sock_client); SockError("proxy_handlereq(): host missing from http header"); return 1; } // allow callback function to intercept if (proxy_callback_fn != NULL) if ((*proxy_callback_fn)(host, buf, sock_client) != 0) { // callback took over SockClose(sock_client); return 0; } //MessageBox(0, buf, "Header", MB_SYSTEMMODAL); // change host and portnum if using downstream proxy if (proxy_extproxyaddr != NULL) { strcpy(host, proxy_extproxyaddr); serverPort = proxy_extproxyport; } // try to find server if (proxy_getaddr(host, serverPort, &serverSockAddr) == 0) { SockSend(sock_client, "404 Host Not Found\n\n", 20); SockClose(sock_client); return 1; } sock_server = socket(AF_INET, SOCK_STREAM, 0); #ifdef WINDOWS setsockopt(sock_server, IPPROTO_TCP, TCP_NODELAY, (char * ) &one, sizeof (int)); #endif // try to connect to server if ((Status = connect(sock_server, &serverSockAddr, sizeof(serverSockAddr))) < 0) { SockSend(sock_client, "404 Host Not Found\n\n", 20); SockClose(sock_client); return 1; } // send client's req to server SockSend(sock_server, buf, strlen(buf)); // // now loop around relaying stuff between server and client // maxfd = (sock_client > sock_server ) ? sock_client : sock_server; for(;;) { FD_ZERO(&rfds); FD_SET(sock_client, &rfds); FD_SET(sock_server, &rfds); if ((n = select(maxfd+1, &rfds, NULL, NULL, NULL)) < 0) { SockError("proxy_handlereq(): select() failed while handling http req"); //fprintf(logfp, "%s: select() failed!: ", prog); //fperror(logfp, ""); return 1; } // got data from client - relay to server if(FD_ISSET(sock_client, &rfds)) { if ((n = SockReceive(sock_client, buf, sizeof(buf))) <= 0) break; // end of request if (SockSend(sock_server, buf, n) != n) { //fprintf(logfp, "%s: write to: %s failed: ", prog, http->host); //fperror(logfp, ""); return 1; } continue; } // got data from server - relay to client if (FD_ISSET(sock_server, &rfds)) { if ((n = SockReceive(sock_server, buf, sizeof(buf))) < 0) { //fprintf(logfp, "%s: read from: %s failed: ", prog, http->host); //fperror(logfp, ""); // eno = safe_strerror(errno); // sprintf(buf, CFAIL, http->hostport, eno); // freez(eno); //write_socket(m_SockClient, buf, strlen(buf), 0); return 1; } if (n == 0) break; // got all from server /* just write */ if (SockSend(sock_client, buf, n) != n) { //fprintf(logfp, "%s: write to client failed: ", prog); //fperror(logfp, ""); return 1; } continue; } // 'if (got something from server)' } // 'for (;;)' - relaying data between client and server // all done - close sockets and terminate this thread SockClose(sock_client); SockClose(sock_server); // see you later return 0; } // 'proxy_handlereq()'
UINT _DownloadUrlRange(LPVOID p) { DownloadRangeStruct *pDownloadRange = (DownloadRangeStruct *)(long)p; int nBlockIndex = pDownloadRange->nBlockIndex; if(nBlockIndex < 0 || nBlockIndex >= MAXBLOCKNUMBER) { //error return 0; } int nDownloadTimes = 0; SOCKADDR_IN sin; SOCKET sock = INVALID_SOCKET; CString csHead, tmp; CBuffer reqBuf, respBuf; int err;//, len = 0; char bBuf[MAX_BUFFER_SIZE] = {0}; int cbBuf = MAX_BUFFER_SIZE; int cbRead = 0; int nFPPos = 0; SockGetAddr(pDownloadRange->host, pDownloadRange->port, sin); pDownloadRange->bFinished[nBlockIndex] = FALSE; startDownload: nDownloadTimes ++; if(pDownloadRange->DownloadRangeFileInfo.nFinishedLength[nBlockIndex] >= pDownloadRange->DownloadRangeFileInfo.nBlockLength[nBlockIndex]) { //finish this block pDownloadRange->bFinished[nBlockIndex] = TRUE; return 1; } //not finished, ... sock = INVALID_SOCKET; sock = SockConnect((LPSOCKADDR)&sin, REGULAR_CONN_TIMEOUT); if (sock != INVALID_SOCKET) { nFPPos = pDownloadRange->DownloadRangeFileInfo.nStartPos[nBlockIndex] + pDownloadRange->DownloadRangeFileInfo.nFinishedLength[nBlockIndex]; if(pDownloadRange->DownloadRangeFileInfo.nEndPos[nBlockIndex] != 0) { tmp.Format(HTTP_RANGE1, nFPPos, pDownloadRange->DownloadRangeFileInfo.nEndPos[nBlockIndex]); } else { tmp.Format(HTTP_RANGE2, nFPPos); } if(pDownloadRange->cookie != "") { csHead.Format(HTTP_HEADER, pDownloadRange->obj, pDownloadRange->host, tmp, USER_AGENT, pDownloadRange->host, "Cookie: ", pDownloadRange->cookie); } else { csHead.Format(HTTP_HEADER, pDownloadRange->obj, pDownloadRange->host, tmp, USER_AGENT, pDownloadRange->host, "", ""); } SockSend(sock, csHead, csHead.GetLength(), err); if (SockReadable(sock, REGULAR_CONN_TIMEOUT)) { //get the 1st recv buf memset(bBuf, 0, cbBuf); cbRead = recv(sock, bBuf, cbBuf, 0); if(cbRead > 0) { if(strstr(bBuf, "HTTP/1.1 206") && strstr(bBuf, "\r\n\r\n")) { pDownloadRange->DownloadFileCS.Lock(); fseek(pDownloadRange->filepointer, nFPPos, 0); char *s = strstr(bBuf, "\r\n\r\n"); int nHeaderLen = s - bBuf + 4; fwrite(s + 4, 1, cbRead - nHeaderLen, pDownloadRange->filepointer); nFPPos += cbRead - nHeaderLen; pDownloadRange->DownloadRangeFileInfo.nFinishedLength[nBlockIndex] += cbRead - nHeaderLen; UpdateFinishedInfo(pDownloadRange->filepointer, pDownloadRange->DownloadRangeFileInfo.nFileLength, nBlockIndex, &pDownloadRange->DownloadRangeFileInfo.nFinishedLength[nBlockIndex]); fflush(pDownloadRange->filepointer); pDownloadRange->DownloadFileCS.Unlock(); memset(bBuf, 0, cbBuf); while(cbRead = recv(sock, bBuf, cbBuf, 0), cbRead > 0) { pDownloadRange->DownloadFileCS.Lock(); fseek(pDownloadRange->filepointer, nFPPos, 0); fwrite(bBuf, 1, cbRead, pDownloadRange->filepointer); nFPPos += cbRead; pDownloadRange->DownloadRangeFileInfo.nFinishedLength[nBlockIndex] += cbRead; UpdateFinishedInfo(pDownloadRange->filepointer, pDownloadRange->DownloadRangeFileInfo.nFileLength, nBlockIndex, &pDownloadRange->DownloadRangeFileInfo.nFinishedLength[nBlockIndex]); fflush(pDownloadRange->filepointer); pDownloadRange->DownloadFileCS.Unlock(); Sleep(1); memset(bBuf, 0, cbBuf); if(pDownloadRange->DownloadRangeFileInfo.nFinishedLength[nBlockIndex] >= pDownloadRange->DownloadRangeFileInfo.nBlockLength[nBlockIndex]) { break; } } } } } closesocket(sock); } else { Sleep(500); } if(nDownloadTimes < MAX_RETRY_TIMES) { Sleep(200); goto startDownload; } pDownloadRange->bFinished[nBlockIndex] = TRUE; return 0; }
BOOL DownloadUrl_wiki(LPCSTR host, USHORT port, LPCSTR objPath, LPCTSTR objName, CString &csNewURL, CString &csCookie) { SOCKADDR_IN sin; SOCKET sock = INVALID_SOCKET; CString csHead, tmp, csPostStr; CBuffer reqBuf, respBuf; int err; char bBuf[MAX_BUFFER_SIZE] = {0}; int cbBuf = MAX_BUFFER_SIZE; int cbRead = 0; char *s = NULL; BOOL re = false; csCookie = ""; csNewURL = ""; SockGetAddr(host, port, sin); sock = INVALID_SOCKET; sock = SockConnect((LPSOCKADDR)&sin, REGULAR_CONN_TIMEOUT); if (sock != INVALID_SOCKET) { csHead.Format(WIKI_HTTP_GET, objPath, USER_AGENT, host); SockSend(sock, csHead, csHead.GetLength(), err); if (SockReadable(sock, REGULAR_CONN_TIMEOUT)) { memset(bBuf, 0, cbBuf); cbRead = recv(sock, bBuf, cbBuf, 0); if(cbRead > 0) { if(strstr(bBuf, "HTTP/1.1 200") && strstr(bBuf, "\r\n\r\n")) { s = strstr(bBuf, "Set-Cookie: "); char *sEnd = strstr(s, ";"); if(sEnd) { csCookie = CString(s + 12, sEnd - s -12); } else { sEnd = strstr(s, "\r\n"); csCookie = CString(s + 12, sEnd - s - 12); } } } } closesocket(sock); } if (csCookie == "") { goto Error; } sock = INVALID_SOCKET; sock = SockConnect((LPSOCKADDR)&sin, REGULAR_CONN_TIMEOUT); if (sock != INVALID_SOCKET) { CString csRef; unsigned long nID = 0; sscanf(objPath, "/%d", &nID); csPostStr.Format(WIKI_POST_STRING, nID, objName); int nActLen = csPostStr.GetLength(); csRef.Format("http://%s%s", host, objPath); csHead.Format(WIKI_HTTP_POST, objPath, csRef, USER_AGENT, host, nActLen, csCookie, csPostStr); SockSend(sock, csHead, csHead.GetLength(), err); csCookie += "; "; if (SockReadable(sock, REGULAR_CONN_TIMEOUT)) { memset(bBuf, 0, cbBuf); cbRead = recv(sock, bBuf, cbBuf, 0); if(cbRead > 0) { if(strstr(bBuf, "HTTP/1.1 ") && strstr(bBuf, "\r\n\r\n")) { s = strstr(bBuf, "Set-Cookie: "); char *sEnd = strstr(s, ";"); if(sEnd) { csCookie += CString(s + 12, sEnd - s -12); } else { sEnd = strstr(s, "\r\n"); csCookie += CString(s + 12, sEnd - s - 12); } s = strstr(bBuf, "Location: "); sEnd = strstr(s, "\r\n"); csNewURL = CString(s + 10, sEnd - s -10); re = true; } } } closesocket(sock); } Error: return re; }
BOOL DownloadUrl_live(LPCSTR host, USHORT port, LPCSTR objPath, CString csName, CString &csNewURL) { SOCKADDR_IN sin; SOCKET sock = INVALID_SOCKET; CString csHead; CBuffer reqBuf; int err; char bBuf[MAX_BUFFER_SIZE + 1] = {0}; int cbBuf = MAX_BUFFER_SIZE; int cbRead = 0; char *s = NULL; BOOL re = false; CString url; CString csContent = ""; csNewURL = ""; SockGetAddr(host, port, sin); sock = INVALID_SOCKET; sock = SockConnect((LPSOCKADDR)&sin, REGULAR_CONN_TIMEOUT); if (sock != INVALID_SOCKET) { csHead.Format(LIVE_HTTP_GET, objPath, USER_AGENT, host); SockSend(sock, csHead, csHead.GetLength(), err); if (SockReadable(sock, REGULAR_CONN_TIMEOUT)) { memset(bBuf, 0, cbBuf); cbRead = recv(sock, bBuf, cbBuf, 0); if(cbRead > 0) { if(strstr(bBuf, "HTTP/1.1 200") && strstr(bBuf, "\r\n\r\n")) { // && strstr(bBuf, "downloadUrl:")){ s = strstr(bBuf, "\r\n\r\n"); csContent = s; CString str; str.Format("%s\\x3fdownload\\x26psid\\x3d1', downloadUrl: '", csName); while(SockReadable(sock, REGULAR_CONN_TIMEOUT)) { if(cbRead = recv(sock, bBuf, cbBuf, 0), cbRead > 0) { bBuf[cbRead] = 0x00; csContent += bBuf; if(csContent.Find(str) != -1) { url = csContent.Mid(csContent.Find(str) + str.GetLength()); if((url.Find("http") != -1) && (url.Find("\\x3fdownload") != -1)) { //MessageBox(0,url, csName, 0); break; } } } } if(csContent.Find(str) != -1) { url = csContent.Mid(csContent.Find(str) + str.GetLength()); url = url.Mid(url.Find("http")); url = url.Left(url.Find("\\x3fdownload")); url.Replace("\\x3a", ":"); url.Replace("\\x2f", "/"); csNewURL = url; re = true; } } } } closesocket(sock); } return re; }