Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 28 kết quả

Đề tài: Simple WebServer C++ | Mã nguồn webserver đơn giản

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    21

    Mặc định Simple WebServer C++ | Mã nguồn webserver đơn giản

    Chào mọi người !

    Mình là 1 lính mới tò te mới chập chững bước vào lĩnh vực lập trình mạng, nay mở topic này mong mọi người góp ý để mình và mọi người trong diễn đàn học hỏi thêm

    Để tiếp cận bài dễ dàng hơn mọi người cần 1 số kiến thức cơ bản về OOP, WinSock, TCP/IP.

    WebServer

    1. Giao thức và kỹ thuật sử dụng :
    * Giao thức : TCP/IP, Reliable transport
    * Sơ lược quá trình hoạt động của WebSever (đây là quan điểm của mình nếu có gì ko đúng mọi người cho ý kiến nha) : Server sẽ nhận Request từ Client rồi gửi trả cho Client 1 trang web Server phải đáp ứng được nhìu Request cùng 1 lúc (có giới hạn).
    * Kỹ thuật :
    o Server Listening Socket :
    + Khởi động WinSock : int WSAStartup(WORD wVersionRequested, LPWSADATA LPWSAData);
    + Khởi tạo Socket : SOCKET socket(int af, int type, int protocol);
    + Kết buột SOCKET với Port : int bind(SOCKET s, const struct sockaddr FAR *name , int namelen);
    + Lắng nghe trên Port của Server: int listen(SOCKET s, int backlog);
    + Xác nhận mối nối của Client : SOCKET accept(SOCKET s, struct sockaddr FAR *addr, int FAR addrlen);

    còn tiếp .....

  2. #2
    Ngày gia nhập
    11 2007
    Bài viết
    21

    Source code ! Mong các sư huynh chỉ giáo
    C++ Code:
    1. #ifndef _CSERVER_H_
    2. #define _CSERVER_H_
    3.  
    4. #include <iostream.h>
    5. #include <stdio.h>
    6. #include <string>
    7.  
    8. #include <winsock2.h>
    9. #pragma comment (lib,"ws2_32.lib")
    10.  
    11. #define MAXBUFLEN 2048 //Gia toi da cua Buffer
    12. #define PORT      80   //Dinh Port cho Sever dang Web 80
    13. #define BACKLOG   5    /*So luong ket noi duoc phep
    14.                        (cho phep 5 client cung luc ket noi toi Server*/
    15.  
    16. class CServer
    17. {
    18.     protected:
    19.  
    20.         SOCKET sSockServer; //Socket cua server lang nghe ket noi
    21.         //SOCKET sSockClient;
    22.  
    23.         struct sockaddr_in ServerAddr; //Dia chi cua Server
    24.         //struct sockaddr_in ClientAddr;
    25.  
    26.         int iServerLength;  //Chieu dai cua dia chi server
    27.         //int iClientLength;
    28.  
    29.     public:
    30.  
    31.         CServer();
    32.         ~CServer();
    33.  
    34.         int  InitWinSock();  //Khoi dong WinSock
    35.         int  InitSocket();   //Khoi dong Socket
    36.         int  Start();        //Khoi dong WinSock va khoi tao Socket
    37.  
    38.         int  Bind();         //Ket buot Socket Server voi port cung nghi thuc TCP/IP
    39.         int  Listen();       //Server lang nghe tai Port 80 ...
    40.         void Service();      //Reveice & Response request
    41.  
    42.         void  CloseSocket(); //Huy Socket
    43.         void  CloseWinSock();//Huy WinSock
    44.         void End();          //Huy Socket va huy WinSock
    45. };

    Visual C++ Code:
    1.  //////////////////////////////////////////////////////////////////////////////////////////////
    2. //                                                                                                   //
    3. /////////////////////////////////////////////////////////////////////////////////////////////
    4.  
    5. #include "CServer.h"
    6.  
    7.  
    8. //Constructor, Destructor
    9. CServer::CServer()  {}
    10.  
    11. CServer::~CServer() {}
    12.  
    13. ///////////////////////////////////////////////////////////////////////////////////////////////
    14. //Khoi dong WinSock
    15. int CServer::InitWinSock()
    16. {
    17.     WSADATA wsData;
    18.  
    19.     //Khoi dong winsock phien ban 2.2
    20.     int iResult = WSAStartup(MAKEWORD(2, 2), &wsData);
    21.    
    22.     if(iResult != 0)
    23.     {
    24.         cout << "Loi khoi dong WinSock" << endl;
    25.         WSAGetLastError(); //Xac dinh ro thong tin loi~
    26.         return 1;
    27.     }
    28.     else
    29.         cout << "Khoi dong WinSock thanh cong!" << endl;
    30.  
    31.     return 0;
    32. }
    33.  
    34.  
    35. //Khoi tao Socket
    36. int CServer::InitSocket()
    37. {
    38.  
    39.     //Khoi tao Socket ( TCP/IP )
    40.     sSockServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    41.  
    42.     if(sSockServer == INVALID_SOCKET)
    43.     {
    44.         cout << "Loi khoi tao Socket" ;
    45.         WSAGetLastError();
    46.         WSACleanup(); //Khong the khoi tao duoc Socket ta huy WinSock
    47.         return 1;
    48.     }
    49.     else
    50.         cout << "Khoi tao Socket thanh cong !" << endl;
    51.  
    52.     return 0;
    53. }
    54.  
    55.  
    56. //Khoi dong WinSock & khoi tao Socket, ha`m tra ve` ma~ loi~
    57. int CServer::Start()
    58. {
    59.     if(this->InitWinSock())
    60.         return 1;
    61.     if(this->InitSocket())
    62.         return 1;
    63.     return 0;
    64. }
    65.  
    66.  
    67. ///////////////////////////////////////////////////////////////////////////////////////////////
    68. //Dan dia chi cuc bo tren Socket (ket buot Socket voi 1 Port tren Server)
    69. int CServer::Bind()
    70. {
    71.     ServerAddr.sin_family = AF_INET;           //Dung IP de truyen du lieu
    72.     ServerAddr.sin_port   = htons(PORT);              //port 80 (web)
    73.     ServerAddr.sin_addr.s_addr   = INADDR_ANY; //Lay IP cua may'
    74.  
    75.     iServerLength = sizeof(ServerAddr);        //Lay kich thuoc cua dia chi cua Server
    76.  
    77.     int iResult = bind(sSockServer, (struct sockaddr*) &ServerAddr, iServerLength);
    78.  
    79.     if(iResult == SOCKET_ERROR) //bind tra ve SOCKET_ERROR khi bi loi~
    80.     {
    81.         cout << "Khong ket buoc duoc Socket va Port!" << endl;
    82.         WSAGetLastError();
    83.         this->End();
    84.         return 1;
    85.     }
    86.  
    87.     return 0;
    88.  
    89. }
    90.  
    91.  
    92. ///////////////////////////////////////////////////////////////////////////////////////////////
    93. //Lang nghe ket noi tai Port 80 ....
    94. int CServer::Listen()
    95. {
    96.     //Lang nghe tren Socket, hang doi toi da BAKLOG 5
    97.     int iResult = listen(sSockServer, BACKLOG);
    98.  
    99.     if(iResult == SOCKET_ERROR)
    100.     {
    101.         cout << "Khong the lang nghe ket noi !" << endl;
    102.         WSAGetLastError();
    103.         return 1;
    104.     }
    105.  
    106.     //cout << "Dang lang nghe ket noi... tai IP: " << inet_ntoa(ServerAddr.sin_addr) << " PORT: " << ServerAddr.sin_port << "\nCTRL + C de STOP SERVER\n\n" ;
    107.     printf("Server listening ....");
    108.  
    109.     return 0;
    110. }
    111.  
    112.  
    113. ///////////////////////////////////////////////////////////////////////////////////////////////
    114. //Xu li
    115. void CServer::Service()
    116. {
    117.     //Thong tin cua Client
    118.     SOCKET  sSockClient;
    119.     struct sockaddr_in  ClientAddr;
    120.     int     iClientLength;
    121.  
    122.     //Tien hanh lang nghe tren Socket cua Server
    123.     if(this->Listen())
    124.         return;//Lang nghe that bai thoat khoi ham
    125.    
    126.     //Buffer luu tru lai thong tin request cua Client
    127.     char arrBufRevc[1024] = {0};
    128.  
    129.     //Headers cua trang web gui di
    130.     char arrHeaders[] = "HTTP/1.0 200 OK\r\n"
    131.                         "Server: PhuocTai Winsock Server\r\n"
    132.                         "Date: Fri, 16 November 2007\r\n"
    133.                         "Content-Type: text/html\r\n"
    134.                         "Accept-Ranges: bytes\r\n"
    135.                         "Content-Length: 187\r\n"
    136.                         "\r\n";
    137.  
    138.     //Du lieu chinh gui di
    139.     char arrData[] = "<html>"
    140.                     "<head><title>MY WEBSERVER - WINSOCK C++ - Phuoc Tai</title></head> \r\n"
    141.                     "<body>\r\n"
    142.                     "<h1>HELLO WORLD !</h1>\r\n"
    143.                     "<br>\r\n"
    144.                     "You just call out my name and you know wherever I am<br> \r\n"
    145.                     "phuoctaitp@gmail.com\r\n"
    146.                     "</body>\r\n"
    147.                     "</html>\r\n\n";
    148.  
    149.     //Vong lap vo han cho` request cua Client va` tra loi`
    150.     while (1)
    151.     {      
    152.         iClientLength = sizeof(ClientAddr);      
    153.        
    154.         sSockClient = accept(sSockServer, (struct sockaddr*) &ClientAddr, &iClientLength);      
    155.         if (sSockClient == -1)
    156.         {
    157.             cout << "Loi ket noi tu Client\n";
    158.             continue;
    159.         }
    160.        
    161.         cout << "Nhan ket noi tu: "<< inet_ntoa(ClientAddr.sin_addr) << endl;
    162.        
    163.         //Xoa noi dung Request truoc va nhan Request moi (luu trong Buffer)
    164.         memset(arrBufRevc, 0, sizeof(arrBufRevc));
    165.         recv(sSockClient, arrBufRevc, sizeof(arrBufRevc) ,0);
    166.  
    167.         /*
    168.             Xu Ly Request po tay !
    169.         */
    170.  
    171.         //Gui cho Client Web (headers + Data)
    172.         send(sSockClient, arrHeaders, sizeof(arrHeaders),0);
    173.         send(sSockClient, arrData,    sizeof(arrData),0);
    174.  
    175.  
    176.         //Xuat ra man hinh noi dung cua request Client gui toi
    177.         cout << "\nNoi dung nhan: \n" << endl;
    178.         cout << arrBufRevc << endl;
    179.    
    180.         //Dong ket noi' (huy Socket cua Client)
    181.         closesocket(sSockClient);
    182.     }
    183. }
    184.  
    185. ///////////////////////////////////////////////////////////////////////////////////////////////
    186.  
    187. //Huy Sockket
    188. void CServer::CloseSocket()
    189. {
    190.     closesocket(sSockServer);
    191.     cout << "Huy Socket ! " << endl;
    192. }
    193.  
    194. //Huy WinSock
    195. void CServer::CloseWinSock()
    196. {
    197.     WSACleanup();
    198.     cout << "Huy WinSock !" << endl;
    199. }
    200.  
    201. //Ket thuc ket noi huy Socket sau do huy Winsock
    202. void CServer::End()
    203. {
    204.     this->CloseWinSock();
    205.  
    206.     this->CloseSocket();
    207. }
    You just call out my name an

    Cuối cùng là cái main phew`

    C++ Code:
    1.  #include "CServer.h"
    2. #include <conio.h>
    3.  
    4. int main()
    5. {
    6.     CServer Server;
    7.    
    8.     //Khoi dong
    9.     if(Server.Start()) // Trong truong hop tra ra 1 ham` ta tra ve 1
    10.         return 1;
    11.  
    12.     //Ket buot IP va Port
    13.     if(Server.Bind()) // Trong truong hop tra ra 1 ham` ta tra ve 1
    14.         return 1;
    15.  
    16.     //Xu ly Client & Server
    17.     Server.Service();
    18.  
    19.     //Huy WinSock & Socket
    20.     Server.End();
    21.  
    22.     return 0;
    23. }

    Có chỗ nào dở các sư huynh chỉ giáo đệ với ! cám ơn rất nhìu

  3. #3
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Chú ý : bài này có tham khảo của ông eXecutve bên diedantinhoc.net (copy có chỉnh sữa)

  4. #4
    Ngày gia nhập
    11 2007
    Bài viết
    21

    Chào bác Vip !
    Chính xác em có tham khảo của Bác eXecutve nhưng em đang cố gắng hoàn thiện hơn ! Mình muốn cầu tiến thì phải học lóm chứ ạ ! Mong các anh chị chỉ giáo thêm !

  5. #5
    Ngày gia nhập
    11 2007
    Bài viết
    21

    Các mod và Admin cho em ít ý kiến với em thấy bài của em còn nhìu nhìu cái dở lắm hjx. Chẳng hạn :

    - Code của em có đoạn này dở lắm nè :
    C++ Code:
    1. char arrData[] = "<html>"
    2.                     "<head><title>MY WEBSERVER - WINSOCK C++ - Phuoc Tai</title></head> \r\n"
    3.                     "<body>\r\n"
    4.                     "<h1>HELLO WORLD !</h1>\r\n"
    5.                     "<br>\r\n"
    6.                     "You just call out my name and you know wherever I am<br> \r\n"
    7.                     "phuoctaitp@gmail.com\r\n"
    8.                     "</body>\r\n"
    9.                     "</html>\r\n\n";
    - Vì như thế trang web sẽ rất hạn chế, em tính đọc 1 file file.html rồi lưu vào buffer nhưng làm hoài hông được khi thì xuất rác khi thì ko xuất gì hết tức điên !
    Code chạy hông được nè các bác tham khảo cho ý kiến nha !

    C++ Code:
    1. FILE *f;
    2.  
    3.         //Mở file MyWeb.html ở đây em ko rành lắm về mở File
    4. lúc đầu em mở = "rb" nhưng thầy nói văn bản thô ko nên mở như vậy em ko hỉu gì hết !
    5.  
    6.     f = fopen("MyWeb.html", "r");
    7.  
    8.     int iLength;
    9.  
    10.         //hàm này trả về số byte nó thật sự đọc được
    11.     iLength = fread(arrTemp, 1, sizeof(arrTemp), f);
    12.  
    13.     char *arrData;
    14.  
    15.     arrData = new char[iLength];
    16.  
    17.     fread(arrData, 1, iLength, f);
    18.  
    19.     fclose(f);

    - Còn 1 phần nữa cái Webserver là chương trình iterative (lặp) còn 1 loại là concurrent (đồng thời) nữa ! nhưng cái concurrent khó quá em bó tay nó đòi hỏi kiến thức về Process & Thread, synchronize, critical section ... thầy em chỉ nói sơ sơ em muốn tìm hiểu thêm nhưng ko có tài liệu bác nào am hỉu thì chỉ dạy với (share tài liệu ok lun, nhưng em ngán tài liệu tiếng anh lắm hjx)
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 25-03-2009 lúc 11:55 PM. Lý do: + +

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Mặc định Simple WebServer C++ | Mã nguồn webserver đơn giản

    Nếu đã code được tới như vầy thì mấy vấn đề còn lại cậu hoàn toàn có thể tự mình giải quyết được, còn nếu kiến thức cơ bản cậu chưa có thì chịu khó học lại.

  7. #7
    Ngày gia nhập
    11 2007
    Bài viết
    21

    Chào huynh !
    Huynh đã nói thế thì đệ đành chịu vậy ! thật ra thầy mình chưa dạy tới dọc ghi file, và xâu kí tự mình cũng rất mún tìm hỉu nên muốn post bài lên đây hy vọng các huynh giúp, níu huynh đã nói vậy thì mình tự nghiên cứu vậy. Thanks đã reply !
    Thân

  8. #8
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Không phải tui không muốn giúp, nhưng tui rất không thích người này lấy code của người khác rồi post lên để tăng post count, thêm điểm,... Chỉ nên post cái thực sự mình làm, thật sự mình hiểu, hoặc post các vấn đề khó khăn mà mình đang gặp phải, đã tự giải quyết mà không được.
    Tui không khuyến khích các cậu học nhảy cóc, nóng vội. Rất có hại cho các cậu. Tui đã luôn nói: Học từ từ, chậm mà chắc, nhanh thì hỏng cẵng, mất công quay lại học lại.

  9. #9
    Ngày gia nhập
    11 2007
    Bài viết
    21

    Chào bạn !
    - Biết bạn cũng có ý tốt ! Nhưng có điều này mình muốn nói thứ nhất đó giờ mình không quan tâm tới chiện post count, thêm điểm ... mình vào diễn đàn này chỉ có 1 ý định duy nhất là học hỏi thêm kinh nghiệm thôi.

    - Còn chiện mà lấy code của người khác tui ko nghĩ nó xấu như bạn nghĩ, lấy của người khác nhưng mình phải biết tự cải tiến sao cho nó hay hơn tốt hơn hoàn thiện hơn thì níu tui là ông eXecutve thì tui cũng mún bài của mình được mọi người quan tâm tham khảo và phát triển hơn đó không phải và ý định của 1 người khi post bài phải ko ạ. Nhưng tui công nhận câu này "Học từ từ, chậm mà chắc, nhanh thì hỏng cẵng, mất công quay lại học lại" rất hay, rất bổ ích

    - Và bạn ạ cái code này cũng chính tay mình gõ ra dĩ nhiên phải có tham khảo tài liệu phải không ạ ! ai chẳng thế học chẳng qua là bắt chước nhưng xem ai diễn đạt tốt hơn thôi, và đó là lý do mình lập topic này cho mọi người chia sẻ viết 1 chương trình webserver theo OOP

    - Mình muốn hỏi 1 câu thật sự làm, thât sự tìm hiểu là sao ? Tự tạo ra cái mới chăng ? Mình tin trong đó cũng có sự bắt chước + tìm hiểu phải không ạ ?

    - Nhưng mình nói ở đây rằng : Khi 1 một người nào nói mún nhận định người khác xin hãy cân nhắc kĩ hơn !

    PS: Những lời trên hoàn toàn tận lương tâm mình ! Có chỗ nào ko phải các bác chỉ giáo ạ !

    Thân !
    Đã được chỉnh sửa lần cuối bởi zZKiddyZz : 20-11-2007 lúc 09:18 PM.

  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Đọc post của cậu muốn đứt hơi luôn. Ngắt câu nhỏ giùm cái, tại mấy chổ "và" đó
    Bây giờ cậu gác bài này lại, ghi vào ToDo list của mình, học C/C++ phần pointer, string, file cho vững đã. Sau đó quay lại đây hoàn thiện code trên cũng không muộn. Không ai muốn chạy 1 chiếc xe ráp vội vã đâu, mất công té gãy cổ nữa.

Các đề tài tương tự

  1. Phân tích code webserver.
    Gửi bởi ngoctigerstyle trong diễn đàn Nhập môn lập trình Java
    Trả lời: 0
    Bài viết cuối: 08-10-2013, 02:48 PM
  2. Lập trình C++ Cách ghi log của webserver apache
    Gửi bởi mylove14129 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 26-03-2013, 08:55 PM
  3. Lập trình C Chương trình gửi file lên webserver
    Gửi bởi thegioi21master trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 1
    Bài viết cuối: 22-08-2012, 04:09 PM
  4. Không thể giải mã hệ mật mã RSA khi triển khai webserver trên IIS
    Gửi bởi nguyenduykhanh1986 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 0
    Bài viết cuối: 19-03-2012, 01:37 PM
  5. Lập trình Webserver và Csocket
    Gửi bởi ninjaloanthi89 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 29-04-2011, 08:35 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn