SPEAKER: Bây giờ chúng ta hãy bổ nhào vào mã phân phối
và hãy nhìn vào bối cảnh trong đó các mã bạn viết
sẽ được hoạt động.
Vào cuối ngày, bạn sẽ thực hiện
toàn bộ các máy chủ web.
Nhưng chúng tôi đã cung cấp bạn với bộ xương
mã mà có một số chức năng, đặc biệt là liên quan đến mạng.
Hãy có một cái nhìn.
>> Vì vậy, lên đây đối đầu của tập tin là một bó
các tính năng kiểm tra yêu cầu macro.
Bây giờ đây chỉ là một tính năng của c, theo đó theo một bó của các trang man
bạn phải xác định một số các hằng số này là đúng
hoặc là ngay cả con số cụ thể để bạn có quyền truy cập vào các chức năng nhất định.
Nếu không họ sẽ không khai báo và bạn sẽ không có quyền truy cập.
Vì vậy, tôi đã làm điều này bằng cách đọc các trang con người.
Bây giờ xuống dưới, trong dòng 15 đến 17, chúng tôi
có một bó toàn bộ các giới hạn công bố.
>> Và chúng ta đã vay mượn những từ máy chủ web phổ biến được gọi là Apache.
Và đây là những chỉ con số đó sẽ
để giới hạn tổng số byte được phép
trong ngữ cảnh khác nhau cho các yêu cầu HTTP mà một trình duyệt được phép gửi cho tôi.
Tiếp theo, chúng ta định nghĩa octet.
Bây giờ một octet chỉ là một cách ưa thích nói một byte, hoặc tám bit.
Hóa ra trong năm qua một byte chưa hẳn đã là tám bit,
nên octet luôn là tám bit.
Vì vậy, trong trường hợp này, chúng tôi đã được thông qua những gì là phổ biến trong các mạng
thế giới gọi tám byte một octet.
>> Ở đây tôi đã xác định rằng sẽ octet là 512, vì vậy mà nhiều như trong pháp y
khi chúng ta đọc một loạt các byte tại một thời điểm, ở đây quá,
chúng ta sẽ đọc một bó của octet tại một thời điểm.
Tiếp theo một bó toàn bộ các tập tin tiêu đề.
Làm thế nào mà tôi biết để bao gồm những?
Vâng, tôi chỉ đơn giản là đọc man trang cho một số chức năng
mà chúng ta sẽ sử dụng trong phân phối này mã và bao gồm trong những người thân
Tôi được lệnh.
>> Và bây giờ chúng tôi có một kiểu dữ liệu.
Chúng tôi đã tuyên bố một octet là một char.
Và chúng ta sẽ thấy sau này mà đó là sử dụng trong suốt mã.
Và chúng ta đã khai báo một bó toàn bộ các nguyên mẫu,
và chúng tôi sẽ nhanh chóng thông qua mỗi người trong những chức năng.
Cuối cùng, và có lẽ hầu quan trọng để giữ
tâm vào thời điểm này trong những câu chuyện, là có
là, trong thực tế, một toàn bộ bó của các biến toàn cầu
ở phía trên cùng của tập tin, thư mục gốc, CFD, SFD, yêu cầu, tập tin và cơ thể.
>> Bây giờ nói chung, sử dụng quá nhiều toàn cầu biến, hoặc các biến toàn cầu ở tất cả,
không phải là thực hành trở lại.
Nhưng thực ra chúng tôi cũng sử dụng một kỹ thuật gọi là xử lý tín hiệu sau
trong các mã, trong đó cho phép chúng tôi phát hiện khi người dùng chạm một cái gì đó
như CTRL C và tắt các máy chủ một cách duyên dáng.
Và để làm điều đó một cách duyên dáng và thực sự giải phóng bộ nhớ,
chúng ta cần phải có quyền truy cập vào các biến toàn cầu.
>> Và bây giờ chúng ta hãy nhìn vào chính, ổ đĩa toàn bộ chương trình này.
Đầu tiên, ở phía trên ở đây chúng tôi có một biến số lỗi
mà dường như không có một loại, nhưng đó là
bởi vì nó thực sự định nghĩa trong một tập tin gọi là
errno.h lỗi mà được bao gồm lên cao hơn.
Nếu bạn làm con người errno để thực sự xem định nghĩa cho điều này,
bạn sẽ thấy rằng đây là một biến toàn cầu đặc biệt
được thiết lập bởi cả một bó các chức năng không được viết
bởi chúng ta, nhưng bởi các tác giả của Linux và các hệ thống khác để thực sự thiết lập
một số cho rằng biến khi một cái gì đó đi sai để bạn có thể trên toàn cầu
tìm ra những gì đã đi sai.
>> Bây giờ xuống bên dưới, bạn sẽ thấy một mới kỹ thuật có lẽ sử dụng getopt,
một chức năng giúp phân tích cú pháp lệnh đối số dòng để chúng tôi làm không
phải bận tâm lãng phí thời gian tìm hiểu làm thế nào để phân tích một cái gì đó giống như 8080,
hoặc dấu gạch ngang p, hoặc dấu gạch ngang h để được giúp đỡ.
getopt cơ bản nào đó cho chúng tôi.
Xem trang người đàn ông cho biết thêm.
>> Tiếp theo, chúng ta làm một chút về lỗi kiểm tra để chắc chắn
rằng số cổng là trong vòng phạm vi quy định tại các spec.
Tiếp theo, chúng ta thấy một cuộc gọi đến các chức năng bắt đầu, có nghĩa chúng tôi sẽ
xem xét trong một thời điểm, và như tên gọi của nó cho thấy, điều này bắt đầu các máy chủ web.
Ở đây chúng ta có một cuộc gọi đến một chức năng được gọi là tín hiệu mà nói,
nếu và khi bạn nghe Control C từ bàn phím của người sử dụng, đi trước và gọi
một chức năng gọi là xử lý đó sẽ điều cuối cùng để làm sạch và ngăn chặn
các máy chủ.
>> Dưới đây là những gì dường như là một vòng lặp vô hạn, dòng đầu tiên trong số đó
hiệu quả là một cuộc gọi đến một chức năng gọi là
thiết lập lại, mà tôi, chúng ta thực hiện sau này trong trật tự
Việt lên một số các quốc gia toàn cầu của chúng tôi.
Sau đó là một dòng mã mà có điều kiện
đang kiểm tra sự trở lại giá trị của kết nối.
Bây giờ hình kết nối như một vị ngữ, cái gì mà trả về đúng hay sai.
Và đúng như vậy, nhưng có một cái gì đó đặc biệt trong kết nối
ở chỗ nó là một cuộc gọi chặn.
Nó sẽ ngồi đó và chờ đợi đến khi trình duyệt của người dùng
cố gắng để kết nối với web này máy chủ và chỉ sau đó nó sẽ
trở về đúng hay sai để chúng tôi tiến hành vào bên trong nếu tuyên bố này.
>> Khi đó, nhận thấy chức năng này để một chức năng được gọi là phân tích cú pháp, mà chúng tôi đã viết,
trong đó phân tích tất cả các octet, tất cả các byte đến từ một trình duyệt
đến máy chủ, vì vậy mà chúng ta có thể bàn tay bạn trở lại cuối cùng một giá trị cho một
của các biến toàn cầu cửa hàng tất cả các byte trong chỉ
các tiêu đề đó yêu cầu, không phải là cơ thể
nếu thật sự có một cơ thể nó.
>> Bây giờ xuống dưới đây chúng ta bắt đầu phân tích những tiêu đề để giải nén
một tập hợp các thông tin mà chúng tôi quan tâm.
Cụ thể, theo đặc điểm kỹ thuật, chúng tôi đầu tiên
muốn yêu cầu dòng, đó là Chỉ là dòng đầu tiên mà
hy vọng rằng một cái gì đó như get giảm hoặc một số con đường và sau đó HTTP 1.1.
Chúng tôi đang sử dụng phép ẩn dụ này của một cây kim trong đống cỏ
để tìm kiếm đặc biệt chars hoặc địa chỉ.
Và quả thật, có một số chức năng trong mã phân phối của chúng tôi
mà bạn cũng có thể tìm thấy hữu ích khi tìm kiếm các giá trị cụ thể.
>> Cuối cùng, chúng tôi sao chép các byte vào một dòng biến gọi là,
trong đó chú ý, quá, chúng tôi đã cấp phát trên stack
bằng cách của một mảng có kích thước động.
Và chúng tôi đang cố tình để tránh gọi malloc
vì một lần nữa, vì Kiểm soát C là
một tính năng tiềm năng của chương trình này, chúng tôi không muốn có mã này bất ngờ
bị gián đoạn bởi các hit người dùng Control C, kết quả trong đó
là tôi có thể không có một cơ hội cho một cái gì đó miễn phí Tôi đã malloced.
Vì vậy, tôi đang cố gắng sử dụng càng nhiều của ngăn xếp là tôi có thể ở đây.
>> Tiếp theo, một bó toàn bộ để dos.
Các đặc điểm kỹ thuật sẽ trình bày chi tiết vào chính xác những gì đang mong đợi ở đây,
nhưng các ý kiến ​​cho bạn một gợi ý về những gì ở phía trước.
Bạn cần đầu tiên để xác nhận các dòng yêu cầu
và chắc chắn rằng nó trông giống như thông số kỹ thuật ngữ pháp, có thể nói,
nói rằng họ nên.
Sau đó, bạn cần phải giải nén một cái gì đó được gọi là các truy vấn, các công cụ ra ngoài
sau dấu hỏi, như chúng ta thấy ở ví dụ Google của chúng tôi
trong chuyển trong một tham số HD.
Sau đó chúng tôi tiếp nhau cùng thư mục gốc của máy chủ web
với con đường đó là trong mà yêu cầu dòng đầu tiên
và hình thành các đường dẫn đầy đủ của các tập tin chúng tôi muốn tìm kiếm.
>> Sau đó, chúng ta sẽ đảm bảo rằng các tập tin tồn tại và có thể đọc được.
Và sau đó chúng ta sẽ phải giải nén nó mở rộng tập tin, .html hoặc .php,
hoặc một số phần mở rộng như vậy mà là ở rất kết thúc của chuỗi yêu cầu.
Tiếp theo là một tổng thể bó mã chúng tôi đã viết
để thực sự tạo ra PHP tạo ra nội dung cho bạn.
Tóm lại, điều này mã mất trong tên
của các tập tin bạn muốn PHP để giải thích.
Chúng tôi vượt qua nó bằng một cái gì đó gọi là một đường ống vào dịch viên PHP.
Lấy lại phản ứng như thể phản ứng là một tập tin đó.
Và sau đó chúng ta lặp qua tập tin của byte, kéo tất cả chúng vào một bộ đệm
để chúng tôi có thể cuối cùng in chúng ra.
>> Thật vậy, tất cả các gọi đây để dprintf
cho phép chúng ta in cái gì được gọi là một mô tả tập tin, mà
chỉ là một số nguyên đại diện cho một tập tin.
Rất tinh thần tương tự, nhưng cơ bản khác nhau từ một tập tin
con trỏ sao.
Chú ý làm thế nào bạn có thể sử dụng cú pháp như printf ở đây để tôi có thể tự động
chèn một cái gì đó giống như chiều dài cho giá trị của một header HTTP
gọi là Content-Length.
Và cuối cùng tôi đã sử dụng chức năng bên phải để thực sự viết
cơ thể để yêu cầu.
>> Thật không may, chúng tôi chỉ thực hiện hỗ trợ cho động
tạo file PHP.
Chúng tôi đã không thực hiện hỗ trợ cho file tĩnh như gifs, và JPEG,
và CSS và HTML.
Điều đó, không may, là để cho các bạn để đáp ứng các mục đích của khách hàng
này để làm.
Vì vậy, trong đó bạn sẽ thấy rằng có không có nhiều cảm hứng trong khối đó,
nhưng nếu bạn cao hơn một chút lên như thế nào chúng tôi đã đi về diễn giải mã PHP,
các chức năng mà bạn sẽ sử dụng là một chút khác nhau.
>> Trong thực tế, bạn có thể mượn một số chức năng
có lẽ từ pháp y Vấn đề đặt, vì
vào cuối ngày tất cả các bạn cần làm ở đây là một khi bạn biết tập tin mở
và một khi bạn biết nó được gọi là Kiểu MIME hoặc loại nội dung,
bạn cần phải đọc trong những byte và bằng cách nào đó nhổ chúng trở lại.
>> Và bây giờ là một tour du lịch này tập tin của các chức năng khác.
Up đầu tiên được kết nối, mà chỉ đơn giản trả về true
khi cuối cùng nó nghe một kết nối từ một người sử dụng.
Tiếp theo là lỗi.
Lỗi, trong khi đó, như một hàm chúng ta viết để xử lý tất cả các khác nhau 400
và trạng thái HTTP 500 mã số mà bạn có thể muốn
để gửi lại cho người sử dụng, cùng với một thông điệp tiêu chuẩn.
>> Tiếp theo là tải, một đặc biệt chức năng thịt, mà mục đích trong cuộc sống
được đọc từ một tập tin con trỏ sao các nội dung của một tập tin vào một bộ đệm toàn cầu
mà chúng tôi tuyên bố trên toàn cầu trên [? chính. ?]
Đây là một chút phức tạp bởi vì chúng tôi phải đọc các byte từ file
nhưng kiểm tra trên mỗi lần lặp cho dù chúng ta đã đã
nhấn cuối của tập tin hay cái gì khác đã đi sai.
Và chúng tôi sử dụng realloc để đảm bảo rằng bất cứ điều gì chúng ta đang sử dụng bộ đệm đang phát triển
và đang phát triển và đang phát triển và luôn ở phía trước của số lượng các byte
rằng chúng ta cần phải phù hợp trong đó.
Handler, trong khi đó, các chức năng mà được
gọi bằng cách có đăng ký Control C như là một tín hiệu
mà chúng tôi muốn chặn.
Chú ý ở đây trong xử lý mà cuối cùng nó
cuộc gọi dừng lại, mà các khóa học dừng các máy chủ web.
Và thật không may, tra cứu không được thực hiện.
Trong tinh thần, đây là một chức năng khá đơn giản.
Với một phần mở rộng tập tin, nó cần để trả lại nó cái gọi là MIME
loại hoặc loại nội dung.
Và chúng tôi chỉ định trong các đặc điểm kỹ thuật những bản đồ đó phải có.
Nhưng bạn cần dịch cuối cùng nó để mã c.
>> Tiếp theo là chức năng tương tự như thịt của chúng tôi được gọi là phân tích cú pháp, mục đích mà trong cuộc sống
là để đọc, không phải từ một tập tin, nhưng từ một kết nối mạng.
Cụ thể, đọc và phân tích Yêu cầu HTTP đó là đến từ một trình duyệt
đến máy chủ để cuối cùng chúng ta có thể phân tích
tại chỉ các tiêu đề trong yêu cầu dòng và trả lại những cho bạn
bằng cách của một bộ đệm toàn cầu chúng ta khai báo bên trên [? chính. ?]
>> Thiết lập lại, trong khi đó, là một chức năng mà chúng ta định nghĩa
đó được gọi là lặp đi lặp lại bên trong của chính mỗi khi bạn đang về
sẵn sàng để bắt đầu nghe cho một kết nối mới
để chúng ta luôn biết trạng thái của các biến của chúng tôi
và vì vậy mà chúng ta cũng đã giải phóng bất kỳ bộ nhớ
có thể đã được phân bổ cho một kết nối mạng trước đó.
Tiếp theo là bắt đầu, chức năng mà chúng tôi đã viết
có chứa một tổng thể nhiều mã mạng
mà cuối cùng bắt đầu các máy chủ web.
>> Lên cuối cùng là hàm gọi là dừng lại, mà
thực hiện chính xác rằng, nó dừng các máy chủ web.
Nhưng trước tiên nó giải phóng bất kỳ bộ nhớ mà vẫn được giao.
Nhưng cuối cùng nó gọi exit mà thậm chí không trả lại điều khiển
chức năng chính của chúng tôi.
Cuối cùng, một trong những hầu hết các kỹ thuật quan trọng
khi triển khai máy chủ web này là sẽ là một chút thử và sai,
có một cửa sổ mở trình duyệt ở bên phải và một cửa sổ terminal tại
trái, các máy chủ giao diện điều khiển cửa sổ, vì vậy mà bạn
có thể xem các thông điệp đó là được hiển thị trên màn hình.
>> Nhưng tốt hơn vẫn sẽ là một phần ba cửa sổ, một cửa sổ terminal thứ hai,
trong đó bạn sử dụng Telnet, việc sử dụng mà được quy định trong spec.
Và Telnet chỉ là một rất chương trình mạng đơn giản
cho phép bạn giả vờ là một trình duyệt trong một cửa sổ
trong khi nói chuyện với các cửa sổ khác.
Bằng cách này bạn có thể nhìn thấy chính xác các lệnh văn bản
mà đang trở lại từ máy chủ cho khách hàng
mà không cần phải poking xung quanh phát triển của chrome
công cụ trong một cách khác giao diện clunkier.