опубликован 06-03-2001 12:46 MSK
у меня была подобная проблемма, тока надо было, чтобы программка скачивала с сервера РосБизнесКонсалтинг курс бакса. А этот курс хранится у них в текстовом файле.Решил я енту проблему с помощью bsd-styled сокетов, но компилировал в Visual C++. Просто мне нужно было, чтобы экзешник получился маленьким :)
char *RbcMessage[] =
{
"GET http://www.rbc.ru/out/801.csv HTTP/1.0\r\n",
"Accept: */*\r\n",
"Referer: http://www.rbc.ru\r\n",
"Accept-Language: ru\r\n",
"Accept-Encoding: gzip, deflate\r\n",
"User-Agent: Informer from RBC\r\n",
"Host: www.rbc.ru\r\n\r\n\r\n",
NULL
};
SOCKADDR_IN remoteAddr;
PHOSTENT phe;
SOCKET SendSocket;
CString m_Kurs;
CString m_Line;
int err;
int iMsg = 0;
int iLength;
int iEnd = 0;
int ndx;
int bytesReceived = 0;
char szLine[712]; //предполагаемая длина принимаемого файла
iLength = 0;
WSADATA WSAData;
WSAStartup(MAKEWORD(1, 1), &WSAData);
//создаём сокет
struct sockaddr_in srv_address;
int namelen;
SendSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(SendSocket != INVALID_SOCKET) {
memset(&srv_address,0,sizeof(SOCKADDR_IN));
srv_address.sin_addr.S_un.S_addr=INADDR_ANY;
srv_address.sin_family = AF_INET;
srv_address.sin_port = 0;
}
if(bind(SendSocket, (SOCKADDR *) &srv_address, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) {
closesocket(SendSocket);
return FALSE;
} else {
namelen=sizeof(SOCKADDR_IN);
getsockname(SendSocket,(SOCKADDR *)&srv_address,&namelen);
return TRUE;
}
//соединяем сокет с сервером
if((phe = gethostbyname("www.rbc.ru"))!=0){ remoteAddr.sin_family = AF_INET;
remoteAddr.sin_port = htons(RBC_PORT);
memcpy((char *)&(remoteAddr.sin_addr), phe->h_addr, phe->h_length);
err = connect (SendSocket, (PSOCKADDR) & remoteAddr, sizeof (remoteAddr));
if(err) {
m_Kurs = "Невозможно соединиться с сервером";
return FALSE;
}
else {
do {
send(SendSocket, (LPSTR)RbcMessage[iMsg], strlen(RbcMessage[iMsg]), 0);
iMsg++;
} while(RbcMessage[iMsg]);
}
do {
iLength = recv(SendSocket, szLine, 712, 0);
if(iLength) {
// Здесь проводится разборка принимаемого файла
m_Line = szLine;
if((ndx = m_Line.Find("USD ЦБ РФ"))!=-1) {
m_Line = m_Line.Left(ndx+23);
m_Line = m_Line.Mid(ndx+10);
m_Kurs = "Курс ЦБ РФ: ";
m_Kurs += m_Line;
}
else m_Kurs = "Неудаётся получить файл с сервера";
}
if(iLength==0) break;
bytesReceived += iLength;
} while ( bytesReceived < 712 );
}
else {
m_Kurs = "Неудаётся установить связь с сервером";
return FALSE;
}
естевственно надо не забыть добавить в проект файл WSOCK32.LIB