Название: Проблема с написанием клиента HTTP Отправлено: erslgoeirjh от Декабрь 16, 2005, 10:37 Имеется такой код:
BOOL MySendFile(TCHAR* myfilename) // посылка выбранного файла на сервер { int sock, recv_len, af, sendres, res; unsigned long mysize, szCodedData, lSize; TCHAR answercode[4], recv_buf[1024], *CodedData, mystrsize[10], myhostname[80]; struct sockaddr_in servAddr; struct hostent *hp; FILE *f; WSADATA W; f = fopen(myfilename,"rb"); fseek(f,0,SEEK_END); lSize = ftell(f); fclose(f); szCodedData = (unsigned long)(1.5*(long double)lSize); CodedData = new TCHAR[szCodedData]; if (!(mysize=base64encode(myfilename,CodedData,szCodedData))) // myfilename -- имя выбранного файла // CodedData -- буфер, в который кодируется по методу base64 этот файл // szCodedData -- размер этого буфера { MessageBox(NULL,"Невозможно преобразовать файл по методу base64.","Ошибка",MB_OK); delete []CodedData; return FALSE; } res = WSAStartup(0x0101,&W); sock = socket(AF_INET,SOCK_STREAM,0); if (sock<0) { MessageBox(NULL,"Невозможно создать сокет.","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } memset((TCHAR*)&servAddr,0,sizeof(servAddr)); servAddr.sin_family = AF_INET; hp = gethostbyname("localhost"); memcpy(&servAddr.sin_addr,hp->h_addr,hp->h_length); servAddr.sin_port = htons(PORTNUMBER); if (res = connect(sock,(sockaddr*)&servAddr,sizeof(servAddr))<0) { MessageBox(NULL,"Невозможно установить сокетное соединения.","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } strcpy(mymessage,"POST /upload.php HTTP/1.1\r\n"); // ïðàâèëüíî ëè? sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Host: "); strcat(mymessage,"localhost"); strcat(mymessage,"\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Content-Type: multipart/form-data;\r\n\tboundary=----------164756348538\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); /* strcpy(mymessage,"Content-Length: "); // óòî?íèòü íàñ?¸ò Content-Length ultoa(mysize,mystrsize,10); strcat(mymessage,mystrsize); strcat(mymessage,"\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } */ //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Connection: close\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Cache-control: no-cache\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n\r\n\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"------------164756348538\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Content-Disposition: form-data; name=\"send_file\"; filename=\""); strcat(mymessage,myfilename); strcat(mymessage,"\"\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { res = WSAGetLastError(); MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Content-Type: application/octet-stream\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { res = WSAGetLastError(); MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Content-Length: "); ultoa(mysize,mystrsize,10); strcat(mymessage,mystrsize); strcat(mymessage,"\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"Content-Transfer-Encoding: base64\r\n\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); sendres = send(sock,CodedData,mysize,0); // îòïðàâëÿåì ôàéë íà ñåðâåð if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } //recv_len = recv(sock,recv_buf,strlen(recv_buf),0); strcpy(mymessage,"------------164756348538--\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { MessageBox(NULL,"Ошибка при посылке данных","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } recv_len = recv(sock,recv_buf,strlen(recv_buf),0); // ñ?èòûâàåì îòâåò ñ ñåðâåðà if (recv_len<=0) // если длина ответа меньше или рана нулю { res = WSAGetLastError(); MessageBox(NULL,"Ошибка приёма ответа с сервера","Ошибка",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } recv_buf[recv_len] = '\0'; MessageBox(NULL,(LPCTSTR)recv_buf,"Ответ сервера",MB_OK); /* strncpy(answercode,recv_buf,3); // ñ?èòûâàåì çíà?åíèå êîäà îòâåòà ñåðâåðà answercode[3] = '\0'; if ((strcmp(answercode,"200")!=0)&&(strcmp(answercode,"201")!=0)) // åñëè êîä îòâåòà ñåðâåðà íå ðàâåí 200 èëè 201 { MessageBox(NULL,"Íåóäà?íàÿ ïåðåäà?à ôàéëà.","Îøèáêà",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } */ closesocket(sock); WSACleanup(); delete []CodedData; return TRUE; } // конец функции MySendFile Суть этой функции такова -- методом POST посылает на сервер бинарный файл (заданный параметром myfilename), предварительно закодировав его методом base64. При этом в блоке strcpy(mymessage,"Content-Type: application/octet-stream\r\n"); sendres = send(sock,mymessage,strlen(mymessage),0); if (sendres==SOCKET_ERROR) { res = WSAGetLastError(); MessageBox(NULL,"Îøèáêà ïðè ïîñûëêå äàííûõ","Îøèáêà",MB_OK); closesocket(sock); WSACleanup(); delete []CodedData; return FALSE; } возникает ошибка при передаче сообщения функцией send (но до этого вызовы send работают нормально). Код этой ошибки -- 10053. Одна из причин этой ошибки может быть в том, что я не правильно написал заголовок или тело метода POST. (Я некоторые части кода закомментировал для отлладки). В чём может быть причина этого? На моём компьютере стоит сервер UniServer, ниже приведён HTML-код страницы http://localhost/ : <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf8" /> <title>Apache test.</title> </head> <body> <form enctype="multipart/form-data" action="upload.php" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="1048576" /> Отправить этот файл: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form> </body> </html> Если посылать файл с помощью этой страницы, то посылка происходит успешно, а в результате неё в файле access.log этого сервера добавляется следующая строка: 127.0.0.1 - - [14/Dec/2005:13:30:44 +0300] "POST /upload.php HTTP/1.1" 200 322 "http://localhost/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)" Если же я посылаю из своей программы, то у меня получается другая строка: 127.0.0.1 - - [14/Dec/2005:17:55:33 +0300] "POST /upload.php HTTP/1.1" 200 148 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" Почему у меня во второй строке не пишется после двух чисел "http://localhost/" ? Что мне нужно исправить в моей функции, чтобы она нормально работала? Название: Проблема с написанием клиента HTTP Отправлено: DmitriyDMA от Февраль 21, 2006, 14:28 [ Это походит на задачку из журнала Хакер =) ]
|