Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: C++
I have a problem with my code.
 
I am trying to write multithread server HTTP on windows. I do not know what I am doing wrong when I started the server and trying to run in browser using my IP, the browser does not show the image which I would like to show.
 
Please help me.
 
Here is the entire code
 
(change your destination where you have some images)
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <winsock2.h>
#include <windows.h>
#include <fstream>
//-----------------------------------------------------------------------
#ifdef UNICODE
std::wstring path;
#else
std::string path;
#endif
 
using namespace std;
#pragma comment(lib, "ws2_32.lib")
#define MAX_THREAD 5
#define true 1
char index[2000 * 600]; 
int     page_size = 0;
 
 
 
//------------------------------------------------------------------------
//funkcja tworzaca glówna strone
void mainPage(char *index)
{
        path = TEXT("d:\\img\\*");
        WIN32_FIND_DATAA fileData;
        HANDLE fileHandle;
    fileHandle = FindFirstFileA("d:\\img\\*", &fileData);
 
        char img_name[255];
        WIN32_FIND_DATA data;
        HANDLE find = INVALID_HANDLE_VALUE;
        TCHAR szDir[MAX_PATH];
        strcpy(index, "<html><head></head><body><center>");
 
        find = FindFirstFile(path.c_str(), &data);
        cout << "<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>"<<endl;
        //cout << "Find: " << find << endl;
        //cout << "FindNextFileA(find,  &fileData) " << FindNextFileA(find,  &fileData) << endl;
        
 
        while (FindNextFileA(fileHandle, &fileData) != 0)
        {
                //cout << "data.dwFileAttributes: " << data.dwFileAttributes << endl;
                //cout << "FILE_ATTRIBUTE_DIRECTORY: "<<(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) << endl;
        if (!(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
        {
                        cout << " w ifie " << endl;
            sprintf(img_name, "<img src='img/%s'>", fileData.cFileName);
                    strncat(index, img_name, strlen(img_name));
        }
                
        }
        
 
   strcat(index, "</center></body></html>");    
   page_size = strlen(index);
   for(int i =0; i< strlen(index); i++)
        {
                        cout << index[i];
        }
        cout << endl;
                
}
//------------------------------------------------------------------------
DWORD generateThread(LPVOID* arg)  
{
        char buffor[1024], sciezka[255], img2[10];
        int i = 6, buffor2 = 1024, retval;
        FILE *img = NULL;
        fstream plik;
        
        fpos_t rozmiar;
        SOCKET connfd = (SOCKET) * arg;
 
        retval = recv(connfd, buffor, sizeof(buffor), 0);
    if (retval == 0) 
        fprintf(stdout, "Blad polaczenia\n");
 
        for (i = 6; i < sizeof(buffor); i++)
        {
                if (buffor[i]==' ')
                {
                        buffor[i] = 0;
                        break;
                }
        }
 
        strcpy(sciezka, buffor + 5);
        //cout << "scizka : "<<sciezka << endl;
        if ((sciezka[0] == 'i') && (sciezka[1] == 'm') && (sciezka[2] == 'g')) //sprawdzanie, czy tag = img
        {
                if (sciezka[strlen(sciezka) - 4]=='.')
                {
                        strncpy(img2, sciezka + strlen(sciezka) - 3, 3);
                        img2[3] = 0;
                }
                else if (sciezka[strlen(sciezka) - 5]=='.')
                {
                        strncpy(img2, sciezka + strlen(sciezka) - 4, 4);
                        img2[4] = 0;
                }
                string strPath = sciezka;
                strPath = "d:/"+strPath;
                cout << "sciezka 2 : " << strPath << endl;
                img = fopen(strPath.c_str(), "rb");
                FILE *iii = NULL;
                //fstream plik(strPath.c_str(), ios::in||ios::out||ios::binary);
                //if(plik.is_open())
                //{
        //              cout << "otwarty plik" <<endl;
        //      }
                //iii = fopen("ll.txt", "rb");
                //cout << "iii : " << img << endl;
//              cout << "img : " << img << endl;
                if(img == NULL)
                {
                        cout << "Blad czytania pliku" << endl;
                }
                else
                {
                        cout << "UF<><><>" << endl;
                        fseek(img, 0, SEEK_END);
                        fgetpos(img, &rozmiar);
                        //cout << "rozmiar : " <<  rozmiar << endl;
                        printf("\tWyslano plik: %s\n", sciezka);
 
                        strcpy(buffor, "HTTP/1.1 200 OK\n");
                        strcat(buffor, "Date: Sat, 24 Mar 2012 17:13:05 GMT\n");
                        strcat(buffor, "Content-Length: ");
 
                        sprintf(buffor + strlen(buffor), "%d\n", rozmiar);
                        strcat(buffor, "Connection: close\n");
                        strcat(buffor, "Content-Type: image/");
                        sprintf(buffor + strlen(buffor), "%s\n\n", img2);
                        
                        retval = send(connfd, buffor, strlen(buffor), 0);
                        fseek(img, 0, SEEK_SET);
 
                        while(!feof(img))
                        {
                                rozmiar = fread(buffor, 10, buffor2, img);       
                                retval = send(connfd, buffor, rozmiar, 0);
                        }
                }
        }
        else
        {
                strcpy(buffor, "HTTP/1.1 200 OK\n");
                strcat(buffor, "Date: Sat, 24 Mar 2012 17:13:05 GMT\n");
                strcat(buffor, "Content-Length: ");
 
                sprintf(buffor + strlen(buffor), "%d\n", page_size);
                strcat(buffor, "Connection: close\n");
                strcat(buffor, "Content-Type: text/html; charset=iso-8859-2\n\n");
 
                retval = send(connfd, buffor, strlen(buffor), 0);
                retval = send(connfd, index, page_size, 0);
        }
}
//------------------------------------------------------------------------
int main(int argc, char** argv) 
{
        SOCKET gniazda[MAX_THREAD];                     //sockety dla kazdego z watków
        LPDWORD watki[MAX_THREAD], alive;   //watki, zmienna sprawdzajaca, czy watek nadal funkcjonuje
        HANDLE uchwyty[MAX_THREAD];                     //uchwyty do watków
        int i = 0, j = 0, size = 0, which = 0, retval = 0, client_addr_len = 0, server_addr_len = 0;
    WSADATA wsaData;
    SOCKET listenfd, connfd;
    struct sockaddr_in server_addr, client_addr;
        
 
 
        //wyczyszczenie tablicy watków, socketów, uchwytów
        memset(&gniazda, NULL, sizeof(gniazda));
        memset(&uchwyty, 0, sizeof(uchwyty));
        memset(&watki, 0, sizeof(watki));
 
    if (argc != 2) 
        {
        fprintf(stderr, "Invocation: %s <port>\n", argv[0]);
        system("pause");
        exit(EXIT_FAILURE);
    }
 
    retval = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (retval != 0) 
        {
        fprintf(stderr, "WSAStartup failed: %d\n", retval);
        exit(EXIT_FAILURE);
    }
 
    listenfd = socket(PF_INET, SOCK_STREAM, 0);
    if (listenfd == INVALID_SOCKET) {
        fprintf(stderr, "socket() failed: %d\n", WSAGetLastError());
        WSACleanup();
        exit(EXIT_FAILURE);
    }
 
    memset(&server_addr, 0,     sizeof(server_addr));
    server_addr.sin_family      =   AF_INET;
    server_addr.sin_addr.s_addr =   htonl(INADDR_ANY);
    server_addr.sin_port        =   htons(atoi(argv[1]));
    server_addr_len             =   sizeof(server_addr);
 
    if (bind(listenfd, (struct sockaddr*) &server_addr, server_addr_len) == SOCKET_ERROR) 
        {
        fprintf(stderr, "bind() failed: %d\n", WSAGetLastError());
        closesocket(listenfd);
        WSACleanup();
        exit(EXIT_FAILURE);
    }
 
    if (listen(listenfd, SOMAXCONN) == SOCKET_ERROR) 
        {
        fprintf(stderr, "listen() failed: %d\n", WSAGetLastError());
        closesocket(listenfd);
        WSACleanup();
        exit(EXIT_FAILURE);
    }
 
    fprintf(stdout, "Oczekiwanie na polaczenie...\n");
    client_addr_len = sizeof(client_addr); 
 
        mainPage(index);
 
        while (true)
        {
                connfd = accept(listenfd, (struct sockaddr*)&client_addr, &client_addr_len);
 
                if (connfd == INVALID_SOCKET) 
                {
                        fprintf(stderr, "accept() failed: %d\n", WSAGetLastError());
                        closesocket(listenfd);
                        WSACleanup();
                        exit(EXIT_FAILURE);
                }
 
                j = 0;
                while (j < MAX_THREAD)
                {
                        switch((int)uchwyty[j])
                        {
                                case 0:
                                        which = j;
                                        gniazda[which] = connfd;
                                        j = MAX_THREAD;
                                        break;
                                default:
                                        alive = (LPDWORD)WaitForSingleObject(uchwyty[j], 0);
                                        if (alive == 0)
                                        {
                                                which = j;
                                                gniazda[which] = connfd;
                                                j = MAX_THREAD;                 
                                        }
                        }
                        j++;
                }
                fprintf(stdout, "Polaczenie z: %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
            uchwyty[which] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&generateThread, &gniazda[which], 0,  (LPDWORD)&watki[which]);
        }
 
    fprintf(stdout, "Closing listening socket and terminating server...\n");
    if (closesocket(listenfd) == SOCKET_ERROR) 
        fprintf(stderr, "closesocket() failed: %d\n", WSAGetLastError());
 
    if (WSACleanup() == SOCKET_ERROR) 
        fprintf(stderr, "WSACleanup failed: %d\n", WSAGetLastError());
 
    exit(EXIT_SUCCESS);
}
//------------------------------------------------------------------------
run appp_name.exe ​​port
Posted 2-Mar-13 5:10am
Edited 2-Mar-13 5:38am
v3

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

You need to fix your usage of char, TCHAR, string and wstring, and the A suffix on some of your system calls. As it stands your code is getting totally confused about which character set it's using. Decide on ASCII or Unicode and stick to it; and use the TEXT() macro on all your character constants. Your usage of the path variable for a constant string is also redundant. As for the rest, you should forget about multi-threading until you have got the basic server program working correctly.
  Permalink  

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 Sergey Alexandrovich Kryukov 464
1 OriginalGriff 449
2 Maciej Los 295
3 Peter Leow 250
4 CPallini 180
0 Sergey Alexandrovich Kryukov 6,971
1 OriginalGriff 5,532
2 Peter Leow 3,997
3 Mika Wendelius 2,850
4 CHill60 2,808


Advertise | Privacy | Mobile
Web02 | 2.8.150224.1 | Last Updated 2 Mar 2013
Copyright © CodeProject, 1999-2015
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100