DWORD WINAPI CommunicationThread( LPVOID param )
{
bool UserOK = 0;
bool PassOK = 0;
#define DEFAULT_BUFLEN 2048
char recvbuf[DEFAULT_BUFLEN];
char commandBuf[DEFAULT_BUFLEN];
int commandBufLenght = 0;
int iResult, iSendResult;
int recvbuflen = DEFAULT_BUFLEN;
SOCKET CommandSocket = INVALID_SOCKET;
CommandSocket = *(SOCKET*)param;
ZeroMemory(recvbuf, DEFAULT_BUFLEN );
ZeroMemory(commandBuf, DEFAULT_BUFLEN );
WaitForSingleObject(Mutex1, INFINITE);
cout << "ClientSocket_in_thread: " << CommandSocket << endl;
ReleaseMutex(Mutex1);
iSendResult = send(CommandSocket, "220 Clear for entry, HafFTPserver\n", 35, 0);
if (iSendResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(CommandSocket);
return 1;
}
do {
iResult = recv(CommandSocket, recvbuf, recvbuflen, 0);
if (iResult > 0)
{
WaitForSingleObject(Mutex1, INFINITE);
cout << "Message " << iResult << " : ";
for(int i = 0; i<iResult; i++)
{cout <<recvbuf;}
cout<<endl;
ReleaseMutex(Mutex1);
if(((recvbuf[iResult-1]!=10)&&(recvbuf[iResult-2]!=13))) // ждем \n, что будет значить конец команды и дописываем команду, пока не встретим
{
strcat(commandBuf,recvbuf);
commandBufLenght += iResult;
ZeroMemory(recvbuf, DEFAULT_BUFLEN );
}else // если встретилось \n в конце строки, то обрабатываем команду
{
strcat(commandBuf,recvbuf);
commandBufLenght += iResult;
if(!strncmp(commandBuf,"USER",4))
{
char *user;
user = (char*)calloc(commandBufLenght-6, 1);
strncat( user,&commandBuf[5] ,commandBufLenght-7);
for(int i =0; i<UserCount; i++)
{
if(Users&&!strcmp(Users,user))
{
cout << "user \"" << user << "\" found!"<<endl;
UserOK = 1;
iSendResult = send(CommandSocket, "331 Password required\n", 23, 0);
if (iSendResult == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(CommandSocket);
return 1;
}
}
}
}
ZeroMemory(commandBuf, DEFAULT_BUFLEN );
ZeroMemory(recvbuf, DEFAULT_BUFLEN );
commandBufLenght = 0;
}
}
else if (iResult == 0)
{printf("Connection closing...\n"); closesocket(CommandSocket); system("pause");}
else {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(CommandSocket);
system("pause");
return 1;
}
} while (iResult > 0);
return 0;
}
c++ FTP сервер. Клиент не воспринимает сообщение сервера
Код:
Так вот в ReGet такая фигня:
Не видет второго сообщения от сервера. Причем неважно, что туда пихать, хоть "331 Password required\n", хоть что угодно другое. При этом на сервер файлзиллы коннектится нормально. И с другой стороны клиент файлзиллы нормально видит второе сообщение:
Что за фигня и как бороться?
[COLOR="white"]Новый термин: очень вложенный условный оператор : D[/COLOR]
В общем сам допер: ReGet чувствителен к тому, что еще и каретку надо возвращать, а не только новую строку в конце кманды отпускать: 331 Password required\r\n - сработало. Но всё же странно, что первое сообщение 220 Clear for entry, HafFTPserver\n глотает и без \r
С другой стороны
Код:
else if(!strncmp(commandBuf,"SYST",4))
{
iSendResult = send(CommandSocket, "215 WIN\r\n", 9, 0);
{
iSendResult = send(CommandSocket, "215 WIN\r\n", 9, 0);
Опять ReGet замолкает с пустой полученной строкой. Кстати что вообще для программы значит ответ на SYST и что мне стоит в ответе написать: UNIX emulated или всё-таки WIN?
Frenzyk, исходники SlimFTPd смотрел?
UPD: попробовал закомментить пару cout'ов, так мусор в FZ пропал. ReGet по презжнему не воспринемает команду.