1 00:00:00,000 --> 00:00:00,390 2 00:00:00,390 --> 00:00:02,931 >> DAVID Malan: Bây giờ chúng ta hãy nhìn vào thực tế phân phối 3 00:00:02,931 --> 00:00:04,310 mã trong tập tin gọi là server.c. 4 00:00:04,310 --> 00:00:06,690 Bây giờ hãy ghi nhớ rằng điều này khá lớn trong tuần này của tập tin. 5 00:00:06,690 --> 00:00:09,922 Đó là hơn 1.000 dòng mã nhưng hầu hết những dòng chúng tôi đã viết. 6 00:00:09,922 --> 00:00:11,880 Và những gì chúng tôi đã để lại là một vài khoảng trống mà bạn sẽ thấy 7 00:00:11,880 --> 00:00:15,088 cần điền vào để thêm một số nhất tính năng hấp dẫn của máy chủ web 8 00:00:15,088 --> 00:00:16,300 để thực sự có được nó bắt đầu. 9 00:00:16,300 --> 00:00:18,890 Thật vậy, nếu bạn chạy phân phối mã sau khi biên dịch nó 10 00:00:18,890 --> 00:00:21,400 bạn sẽ thấy rằng các máy chủ web không làm tất cả những gì nhiều. 11 00:00:21,400 --> 00:00:24,585 Thay vào đó, người dùng nhận được một 501, không được thực hiện, thông báo lỗi. 12 00:00:24,585 --> 00:00:27,210 Nhưng điều đó có ý nghĩa bởi vì cần chúng tôi đã thực sự không được thực hiện 13 00:00:27,210 --> 00:00:28,565 tất cả các chức năng của nó. 14 00:00:28,565 --> 00:00:29,940 Vì vậy, chúng ta hãy nhìn vào server.c. 15 00:00:29,940 --> 00:00:32,500 Và bạn sẽ muốn đi qua này trong một chi tiết nhỏ hơn, 16 00:00:32,500 --> 00:00:34,200 chậm hơn một chút, tốc độ của riêng bạn. 17 00:00:34,200 --> 00:00:36,616 Nhưng bây giờ hãy để tôi cố gắng để hướng dẫn bạn thông qua nó để cung cấp cho bạn 18 00:00:36,616 --> 00:00:39,230 một cảm giác của những gì là hữu ích để biết, những gì là ít hữu ích để biết, 19 00:00:39,230 --> 00:00:41,212 để bạn có thể hướng dẫn thăm dò của riêng bạn. 20 00:00:41,212 --> 00:00:44,170 Vì vậy, ở đầu server.c, tất nhiên, chúng tôi có một bó toàn bộ các định nghĩa. 21 00:00:44,170 --> 00:00:46,130 Cũng như toàn bộ một loạt các bao gồm. 22 00:00:46,130 --> 00:00:49,610 Đáng chú ý là chúng tôi có một vài hằng số toàn cầu ở đây, 23 00:00:49,610 --> 00:00:52,680 mà chúng tôi sử dụng trong mã của chúng tôi để làm cho đảm bảo rằng các mảng nhất định 24 00:00:52,680 --> 00:00:53,780 dài vừa phải. 25 00:00:53,780 --> 00:00:58,020 Dựa trên bao lâu chúng tôi yêu cầu HTTP hy vọng sẽ được tiếp nhận, khả năng, 26 00:00:58,020 --> 00:00:59,860 từ khách hàng web, hoặc các trình duyệt. 27 00:00:59,860 --> 00:01:04,000 >> Trong khi đó, chúng ta hãy di chuyển trên xuống ở đây, với một loại định nghĩa. 28 00:01:04,000 --> 00:01:07,430 Chú ý rằng giống như trong thiết P 4, nhờ đó mà chúng tôi đã chơi với tập tin I / O, 29 00:01:07,430 --> 00:01:09,680 tương tự như vậy ở đây, chúng tôi chơi với rất nhiều byte. 30 00:01:09,680 --> 00:01:11,490 Và vì vậy chúng tôi đã typedeffed char là một byte. 31 00:01:11,490 --> 00:01:16,260 Nói cách khác, các kiểu dữ liệu, vốn B-y-t-e, không tồn tại theo mặc định trong C. 32 00:01:16,260 --> 00:01:20,090 Vì vậy, chúng tôi đã tạo ra nó như là một từ đồng nghĩa với char để chúng tôi có một số giá trị 8-bit 33 00:01:20,090 --> 00:01:21,041 mà để làm việc. 34 00:01:21,041 --> 00:01:23,540 Bây giờ có một bó toàn bộ nguyên mẫu ở đây, một vài trong số đó 35 00:01:23,540 --> 00:01:26,581 là cho chức năng mà bạn sẽ viết, nhưng nhất của họ, chúng tôi đã viết bản thân mình. 36 00:01:26,581 --> 00:01:29,430 Hãy di chuyển xuống bây giờ để cuối cùng, chỉ một vài biến toàn cầu. 37 00:01:29,430 --> 00:01:32,036 Một là này sao char, AKA gốc. 38 00:01:32,036 --> 00:01:34,660 Thật vậy, bạn sẽ nhận thấy chúng tôi không bằng cách sử dụng thư viện CS50 nữa. 39 00:01:34,660 --> 00:01:36,330 Vì vậy, chúng tôi thay vì chỉ sử dụng sao char. 40 00:01:36,330 --> 00:01:38,960 Và gốc là có được một con trỏ đến chuỗi đó 41 00:01:38,960 --> 00:01:41,700 đại diện cho thư mục gốc của máy chủ. 42 00:01:41,700 --> 00:01:44,030 Vì vậy, ví dụ, khi tôi chạy các lệnh trước đó 43 00:01:44,030 --> 00:01:48,100 và chỉ định thư mục gốc của "công chúng", mà thư mục bên trong của phân phối 44 00:01:48,100 --> 00:01:48,800 Mã. 45 00:01:48,800 --> 00:01:52,160 Root, ở đây, sẽ là một con trỏ để chính xác chuỗi đó, "công cộng". 46 00:01:52,160 --> 00:01:57,830 Hoặc thực sự là đường dẫn đầy đủ / home / ubuntu / vv để mà thư mục công cộng. 47 00:01:57,830 --> 00:02:01,930 >> Trong khi đó, ở dòng 67 ở đây, chúng tôi có những gì được gọi là file descriptor. 48 00:02:01,930 --> 00:02:05,329 Đây là tinh thần tương tự nộp con trỏ sao. 49 00:02:05,329 --> 00:02:07,370 Nhưng hóa ra có của một tập hợp các chức năng 50 00:02:07,370 --> 00:02:11,050 bạn có thể sử dụng với đọc các tập tin hoặc đọc từ kết nối mạng. 51 00:02:11,050 --> 00:02:13,280 Giống như một web server web kết nối trình duyệt 52 00:02:13,280 --> 00:02:16,480 thực sự chỉ sử dụng số nguyên thay vì của con trỏ, như chúng ta đã thấy trên P đặt 4. 53 00:02:16,480 --> 00:02:17,530 Nhưng đó là ý tưởng tương tự. 54 00:02:17,530 --> 00:02:21,180 Và tôi đã thực hiện những toàn cầu để giữ theo dõi của một mô tả tập tin khách hàng. 55 00:02:21,180 --> 00:02:22,960 Giống như một con trỏ đến web của khách hàng của tôi. 56 00:02:22,960 --> 00:02:24,212 Và một mô tả tập tin máy chủ. 57 00:02:24,212 --> 00:02:27,170 Sắp xếp của một con trỏ đến máy chủ web, nhưng họ không thực sự con trỏ, 58 00:02:27,170 --> 00:02:28,360 họ chỉ là con số. 59 00:02:28,360 --> 00:02:30,940 >> Cuối cùng, chúng tôi có toàn cầu này biến ở đây được gọi là hiệu. 60 00:02:30,940 --> 00:02:32,690 Đó là cách của tôi, sự thật hay sai, giữ 61 00:02:32,690 --> 00:02:35,450 theo dõi xem người dùng có báo hiệu rằng anh ấy hoặc cô ấy muốn 62 00:02:35,450 --> 00:02:36,680 để ngăn chặn các máy chủ web. 63 00:02:36,680 --> 00:02:39,690 Và thực sự có một chức năng mà nghe cho kiểm soát C. 64 00:02:39,690 --> 00:02:43,650 Vì vậy, nếu bạn, người sử dụng, muốn giết các máy chủ bằng cách nhấn Control C, 65 00:02:43,650 --> 00:02:46,279 rằng biến boolean bạn sẽ thấy trong các mã được thiết lập là true. 66 00:02:46,279 --> 00:02:49,070 Và sau đó trong một vòng lặp chúng tôi giữ kiểm tra giá trị của biến đó. 67 00:02:49,070 --> 00:02:52,560 Và nếu đó là sự thật, chúng ta chỉ thoát khỏi chương trình hoàn toàn. 68 00:02:52,560 --> 00:02:54,050 >> Bây giờ chúng ta hãy nhìn vào chính. 69 00:02:54,050 --> 00:02:56,050 Bạn không cần phải hiểu tất cả mọi thứ trong main, 70 00:02:56,050 --> 00:02:58,030 nhưng chúng ta hãy cung cấp cho bạn một cảm giác của công việc tổng thể. 71 00:02:58,030 --> 00:03:00,571 Và sau đó có một cái nhìn gần hơn cho mình ở một số ý kiến. 72 00:03:00,571 --> 00:03:02,410 Ở nơi đầu tiên, một phần cách thức thông qua chính, 73 00:03:02,410 --> 00:03:04,050 chúng tôi phân tích các đối số dòng lệnh. 74 00:03:04,050 --> 00:03:06,360 Nó chỉ ra rằng chính là sẽ mong đợi một trong hai dấu gạch ngang 75 00:03:06,360 --> 00:03:09,700 h để được giúp đỡ, mà chỉ nói với bạn như thế nào để chạy các chương trình rất ngắn gọn. 76 00:03:09,700 --> 00:03:12,000 Hoặc dash p, cho phép bạn chỉ định một cổng. 77 00:03:12,000 --> 00:03:14,550 Nhưng một lần nữa, bằng cách sử dụng cổng 80 80, theo mặc định, 78 00:03:14,550 --> 00:03:16,940 là những gì bạn nên sử dụng CS 50 IDE. 79 00:03:16,940 --> 00:03:18,800 >> Tiếp theo, chúng ta chỉ cần làm một số kiểm tra lỗi. 80 00:03:18,800 --> 00:03:20,650 Đảm bảo rằng giá trị cổng thực sự là 81 00:03:20,650 --> 00:03:22,770 như chúng ta mong đợi, trong một phạm vi cụ thể. 82 00:03:22,770 --> 00:03:24,630 Và sau đó một số các phép thuật bắt đầu. 83 00:03:24,630 --> 00:03:26,930 Chúng tôi gọi chức năng này bắt đầu, mà chúng tôi đã viết. 84 00:03:26,930 --> 00:03:31,360 Chúng tôi đi vào với các cảng, như cũng như bất kỳ đối số tùy chọn 85 00:03:31,360 --> 00:03:33,770 để khởi động máy chủ. 86 00:03:33,770 --> 00:03:35,830 Cụ thể, rằng số cổng. 87 00:03:35,830 --> 00:03:39,750 >> Tất cả các quyền, tiếp theo, điều này là khá khó hiểu mã mà bạn sẽ không thấy quá thường xuyên, 88 00:03:39,750 --> 00:03:43,170 nhưng đó là một cách ưa thích của kể các chương trình để lắng nghe cho một tín hiệu. 89 00:03:43,170 --> 00:03:46,200 Một tín hiệu là một cái gì đó giống như một đột quỵ quan trọng đặc biệt, như Control C. 90 00:03:46,200 --> 00:03:50,010 Vì vậy, mã này ở đây là làm thế nào chúng ta đăng ký những gì được gọi là một sự kiện nghe. 91 00:03:50,010 --> 00:03:54,420 Theo đó, bất cứ lúc nào người dùng chạm Control C mã để báo cho máy tính 92 00:03:54,420 --> 00:03:56,200 để chạy một chức năng gọi là xử lý. 93 00:03:56,200 --> 00:03:59,844 Được viết dưới thấp hơn, thực hiện hạ thấp xuống trong tập tin này, server.c, 94 00:03:59,844 --> 00:04:01,260 mà dừng chương trình hoàn toàn. 95 00:04:01,260 --> 00:04:04,060 Nhưng không cần phải lo lắng về các chi tiết bên trong đó. 96 00:04:04,060 --> 00:04:06,010 >> Bây giờ chúng ta tập trung vào các vòng trong. 97 00:04:06,010 --> 00:04:09,164 Thật vậy, những gì các máy chủ web được làm là cố ý lặp vô hạn. 98 00:04:09,164 --> 00:04:12,080 Bởi vì sau khi tất cả đó là khá nhiều những gì bạn muốn có một máy chủ web để làm. 99 00:04:12,080 --> 00:04:13,910 Cho đến khi bạn rõ ràng ngăn chặn nó, bạn chỉ muốn 100 00:04:13,910 --> 00:04:15,660 ngồi đó hiệu quả trong vòng một, 101 00:04:15,660 --> 00:04:17,970 chờ đợi một người nào đó trên internet để kết nối với nó. 102 00:04:17,970 --> 00:04:20,519 Vì vậy mà các máy chủ web có thể sau đó đáp ứng một số yêu cầu. 103 00:04:20,519 --> 00:04:22,780 >> Bây giờ nhận thấy ở đầu của chương trình tôi miễn phí 104 00:04:22,780 --> 00:04:26,030 một số biến, bởi vì sau này bạn sẽ thấy chúng ta đang sử dụng malloc ở một số nơi. 105 00:04:26,030 --> 00:04:27,988 Vì vậy, tôi chỉ muốn làm cho chắc chắn tất cả các biến của tôi 106 00:04:27,988 --> 00:04:30,487 được khởi tạo với một số giá trị đã biết. 107 00:04:30,487 --> 00:04:32,820 Xuống đây tôi kiểm tra xem chương trình đã được báo hiệu. 108 00:04:32,820 --> 00:04:35,944 Nói cách khác, nếu người dùng nhấn Control C, chúng ta chỉ cần bỏ ra khỏi vòng lặp này 109 00:04:35,944 --> 00:04:37,150 bằng cách gọi ngừng. 110 00:04:37,150 --> 00:04:40,060 >> Và sau đó bây giờ mã này được một chút thú vị hơn. 111 00:04:40,060 --> 00:04:42,460 Nhưng chú ý rằng bạn không có để viết bất cứ điều gì trong chính. 112 00:04:42,460 --> 00:04:44,760 Thay vào đó, bên trong chính chúng ta làm như sau. 113 00:04:44,760 --> 00:04:47,520 Nếu người dùng có connected-- đây là một hàm chúng ta đã viết, 114 00:04:47,520 --> 00:04:48,880 mà trả về đúng hoặc sai. 115 00:04:48,880 --> 00:04:51,760 Và mỗi lần nó được gọi là nó chỉ nói, vâng, một khách hàng, 116 00:04:51,760 --> 00:04:53,550 một trình duyệt đã được kết nối với máy chủ. 117 00:04:53,550 --> 00:04:54,660 Hoặc, không, nó không có. 118 00:04:54,660 --> 00:04:57,820 Và bằng cách này có thể chúng ta chỉ vòng lặp vô hạn chờ đợi cho đúng 119 00:04:57,820 --> 00:04:59,610 để được trả lại bằng chức năng đó. 120 00:04:59,610 --> 00:05:02,590 >> Trong khi đó, chức năng tiếp theo này, yêu cầu, chúng tôi cũng đã viết cho bạn. 121 00:05:02,590 --> 00:05:07,160 Này có bất cứ điều gì là bên trong đó phong bì ảo, cái gọi là HTTP 122 00:05:07,160 --> 00:05:10,180 yêu cầu, và thực sự phân tích nó như vậy để nói chuyện. 123 00:05:10,180 --> 00:05:13,260 Nhìn vào nó trên xuống dưới, trái sang phải, và tải 124 00:05:13,260 --> 00:05:14,620 tất cả những dòng đầu tiên. 125 00:05:14,620 --> 00:05:17,250 Giống như các dòng get và bất cứ điều gì khác bên dưới nó, 126 00:05:17,250 --> 00:05:19,230 vào một biến chúng tôi đã được gọi là tin nhắn. 127 00:05:19,230 --> 00:05:20,590 Đối với một thông điệp HTTP. 128 00:05:20,590 --> 00:05:23,234 Và chúng tôi cũng đã nạp chiều dài của nó vào chiều dài. 129 00:05:23,234 --> 00:05:24,400 Bây giờ đây là một chút khác nhau. 130 00:05:24,400 --> 00:05:25,650 Vì vậy, chúng ta hãy có một cái nhìn nhanh chóng tại đây. 131 00:05:25,650 --> 00:05:27,110 Mặc dù bạn không phải thực hiện các yêu cầu, 132 00:05:27,110 --> 00:05:29,610 nó rất hữu ích, có lẽ, để hiểu làm thế nào nó hoạt động. 133 00:05:29,610 --> 00:05:33,450 Yêu cầu chức năng này dường như được dùng trong hai tham số, nhắn tin 134 00:05:33,450 --> 00:05:33,960 và chiều dài. 135 00:05:33,960 --> 00:05:38,400 Nhưng chú ý rằng tôi đang đi qua trong một ký hiệu cho cả tin nhắn và chiều dài. 136 00:05:38,400 --> 00:05:42,100 Nhưng nếu chúng ta di chuyển lên, những gì là thông điệp và chiều dài? 137 00:05:42,100 --> 00:05:44,795 >> Cũng nhận thấy thông điệp đó và chiều dài được khai báo bên trong 138 00:05:44,795 --> 00:05:47,900 của chính là một ngôi sao char. 139 00:05:47,900 --> 00:05:49,170 Và một kích thước t. 140 00:05:49,170 --> 00:05:51,710 Mà thực sự là chỉ một int, tương ứng. 141 00:05:51,710 --> 00:05:55,830 Vì vậy, những gì là tò mò ở đây, mặc dù, là nếu tin nhắn này là một ngôi sao char 142 00:05:55,830 --> 00:06:01,160 nhưng tôi đang đi qua trong ký hiệu của tin nhắn, đó là loại giống như công nghệ cao 143 00:06:01,160 --> 00:06:04,475 nhận được địa chỉ của một con trỏ. 144 00:06:04,475 --> 00:06:06,550 Một con trỏ đôi, nếu bạn sẽ. 145 00:06:06,550 --> 00:06:08,740 >> Và trên thực tế, nếu tôi di chuyển trên xuống. 146 00:06:08,740 --> 00:06:13,470 Đường xuống vào tập tin này, nơi yêu cầu được thực sự thực hiện, 147 00:06:13,470 --> 00:06:16,770 Tôi sẽ thấy những điều sau đây chữ ký, hoặc nguyên mẫu, 148 00:06:16,770 --> 00:06:17,520 cho chức năng này. 149 00:06:17,520 --> 00:06:19,580 Mà có lẽ bạn đã không nhìn thấy trước. 150 00:06:19,580 --> 00:06:21,180 Các chức năng yêu cầu trả về một bool. 151 00:06:21,180 --> 00:06:22,430 Đó có thể là quen thuộc. 152 00:06:22,430 --> 00:06:23,830 Nhưng cần chú ý đối số đầu tiên của nó. 153 00:06:23,830 --> 00:06:26,329 Nó được gọi là tin nhắn, nhưng tôi có thể đã gọi nó là bất cứ điều gì ở đây. 154 00:06:26,329 --> 00:06:27,575 Nhưng nó sao sao char. 155 00:06:27,575 --> 00:06:29,420 >> Và đây là loại một điều gọn gàng. 156 00:06:29,420 --> 00:06:33,620 Bởi vì tôi muốn chức năng này yêu cầu để cấp phát bộ nhớ 157 00:06:33,620 --> 00:06:37,250 Tuy nhiên cho lớn các yêu cầu HTTP là ở chỗ phong bì ảo 158 00:06:37,250 --> 00:06:41,670 mà nó nhận được từ trình duyệt, tôi muốn có thể trả về một chuỗi. 159 00:06:41,670 --> 00:06:43,820 Nhưng tôi cũng muốn có có thể trở lại một thời gian. 160 00:06:43,820 --> 00:06:46,470 Vì vậy, như bạn sẽ thấy trong đặc điểm kỹ thuật, C, tất nhiên, 161 00:06:46,470 --> 00:06:47,850 không thể trả lại nhiều giá trị. 162 00:06:47,850 --> 00:06:49,860 Và trong thực tế, tôi chỉ là trả lại một bool ở đây. 163 00:06:49,860 --> 00:06:51,860 Nhưng cũng giống như chúng ta đã thấy trong giảng dạy một khi trở lại bạn 164 00:06:51,860 --> 00:06:57,920 có thể trở lại hai giá trị nếu bạn vượt qua trong hai giá trị tham khảo. 165 00:06:57,920 --> 00:06:59,110 Hoặc bởi con trỏ. 166 00:06:59,110 --> 00:07:03,190 Vì vậy mà bạn có thể thực sự đi đến những địa chỉ, đưa giá trị đó, 167 00:07:03,190 --> 00:07:05,580 và hiệu quả thông qua này kênh trở lại, có thể nói, 168 00:07:05,580 --> 00:07:08,880 có thể một chức năng trở lại nhiều giá trị cho người gọi. 169 00:07:08,880 --> 00:07:12,240 >> Trong trường hợp này, yêu cầu có thể trở về ba giá trị. 170 00:07:12,240 --> 00:07:14,140 Kiểu trả thực tế của nó, một bool. 171 00:07:14,140 --> 00:07:16,490 Các tin nhắn, một ngôi sao char sao. 172 00:07:16,490 --> 00:07:18,590 Và chiều dài, kích thước t. 173 00:07:18,590 --> 00:07:19,810 Mà chỉ là một int. 174 00:07:19,810 --> 00:07:23,100 Bởi vì yêu cầu chức năng này có thể đi đến độ dài địa chỉ 175 00:07:23,100 --> 00:07:24,340 và đặt một giá trị đó. 176 00:07:24,340 --> 00:07:26,970 Và nó có thể đi đến các địa chỉ của tin nhắn và đặt một giá trị đó. 177 00:07:26,970 --> 00:07:28,380 Và bây giờ nên có ý nghĩa. 178 00:07:28,380 --> 00:07:32,740 >> Bởi vì mặc dù tin là một ngôi sao char sao, ngay sau khi 179 00:07:32,740 --> 00:07:37,156 bạn đến đó với thông điệp sao, như chúng ta đã thấy trước đây trong mã, 180 00:07:37,156 --> 00:07:38,280 những gì bạn sẽ tìm thấy? 181 00:07:38,280 --> 00:07:41,030 Bạn sẽ tìm thấy chờ đợi bạn ở đó, một đoạn bộ nhớ mà 182 00:07:41,030 --> 00:07:43,200 phải là một ngôi sao char. 183 00:07:43,200 --> 00:07:44,414 Hoặc địa chỉ của một chuỗi. 184 00:07:44,414 --> 00:07:47,330 Và đó là OK nếu bạn không hoàn toàn bọc tâm trí của bạn xung quanh đó quá nhanh. 185 00:07:47,330 --> 00:07:51,470 Nhưng xem xét rằng tất cả chúng ta đang làm là lấy địa chỉ của một con trỏ 186 00:07:51,470 --> 00:07:53,980 để chúng tôi có thể đến đó và thực sự đặt một con trỏ ở đó. 187 00:07:53,980 --> 00:07:56,510 Nhưng không phải lo lắng nếu đó không hoàn toàn chìm trong chỉ bây giờ. 188 00:07:56,510 --> 00:07:59,080 Biết ngay bây giờ rằng yêu cầu chức năng hiệu quả 189 00:07:59,080 --> 00:08:00,800 cung cấp cho bạn với những ba giá trị. 190 00:08:00,800 --> 00:08:02,290 >> Vì vậy, bây giờ chúng ta quay trở lại chính. 191 00:08:02,290 --> 00:08:06,570 Điều gì đang xảy ra tiếp theo, trong chính, là sau đây. 192 00:08:06,570 --> 00:08:12,020 Một khi tôi đã nhận bên trong của tin và chiều dài, hai giá trị mà tôi quan tâm. 193 00:08:12,020 --> 00:08:14,340 Sau đó chúng tôi đi trước và viết một số mã cho bạn rằng 194 00:08:14,340 --> 00:08:16,807 cho phép bạn đọc chỉ là những dòng đầu tiên. 195 00:08:16,807 --> 00:08:18,640 Cái gọi là yêu cầu dòng từ yêu cầu. 196 00:08:18,640 --> 00:08:23,880 Cụ thể, một cái gì đó như get / HTTP 1.1, và không có gì hơn. 197 00:08:23,880 --> 00:08:26,200 Vì vậy, có một bó toàn bộ header HTTP khác, thu hồi, 198 00:08:26,200 --> 00:08:28,680 mà một trình duyệt sẽ gửi từ một khách hàng đến một máy chủ. 199 00:08:28,680 --> 00:08:31,790 Chúng tôi chỉ cần bỏ qua tất cả những người như vậy mà tất cả các bạn nhìn thấy trên cửa sổ thiết bị đầu cuối, 200 00:08:31,790 --> 00:08:38,559 thu hồi, chỉ là một cái gì đó như, get / hello.HTML HTP / 1.1. 201 00:08:38,559 --> 00:08:41,182 >> Vì vậy, mặc dù nhận thấy, rằng những thủ đoạn chúng ta đang làm gì ở đây 202 00:08:41,182 --> 00:08:43,890 sẽ có ích, có lẽ, trong chức năng phân tích cú pháp của riêng bạn mà 203 00:08:43,890 --> 00:08:44,934 bạn sẽ thực hiện. 204 00:08:44,934 --> 00:08:46,850 Chú ý rằng tôi chỉ là khai báo một biến. 205 00:08:46,850 --> 00:08:49,650 Sẽ xảy ra là const, có nghĩa là, Tôi hứa sẽ không thay đổi điều này. 206 00:08:49,650 --> 00:08:50,720 Được gọi là đống cỏ khô. 207 00:08:50,720 --> 00:08:52,860 Sau đó, tôi khéo léo đặt tên kim biến tiếp theo của tôi, 208 00:08:52,860 --> 00:08:56,130 vì vậy mà tôi có thể nhìn proverbially một cây kim trong một đống cỏ khô, 209 00:08:56,130 --> 00:08:58,530 sử dụng một siêu tiện dụng chức năng gọi là str str. 210 00:08:58,530 --> 00:09:02,860 S-T-R S-T-R, mà mỗi người đàn ông của mình trang, hoặc mỗi reference.CS50.NET, 211 00:09:02,860 --> 00:09:05,220 cho phép bạn tìm kiếm một chuỗi trong một. 212 00:09:05,220 --> 00:09:08,770 Và đây là cách của tôi tìm kiếm sự kết thúc của một dòng 213 00:09:08,770 --> 00:09:11,750 vì vậy mà tôi có thể thực sự đọc chỉ là một dòng vào bộ nhớ. 214 00:09:11,750 --> 00:09:14,860 >> Trong khi đó, thông báo trên đường 176 ở đây, tôi thực sự 215 00:09:14,860 --> 00:09:17,010 bố trí đủ bộ nhớ cho dòng đó. 216 00:09:17,010 --> 00:09:21,350 Và sau đó sử dụng str và sao chép, và chỉ sử dụng một ký hiệu khung ray, 217 00:09:21,350 --> 00:09:23,070 Tôi lưu trữ trong mảng đó? 218 00:09:23,070 --> 00:09:24,926 Chính xác đó dòng đầu tiên. 219 00:09:24,926 --> 00:09:28,050 Trong thực tế, tôi chỉ nhảy qua một cách nhanh chóng các đặc điểm kỹ thuật cho vấn đề tập hợp 220 00:09:28,050 --> 00:09:28,550 sáu. 221 00:09:28,550 --> 00:09:29,841 Đừng đọc qua chi tiết này. 222 00:09:29,841 --> 00:09:32,190 Nhưng những gì bạn sẽ tìm thấy được dòng này cụ thể ở đây. 223 00:09:32,190 --> 00:09:34,810 Nhờ đó mà dựa trên đặc điểm kỹ thuật định nghĩa chính thức 224 00:09:34,810 --> 00:09:40,180 HTTP, chúng tôi xác định những gì đầu tiên dòng nên được từ bất kỳ trình duyệt 225 00:09:40,180 --> 00:09:42,970 đến một máy chủ bên trong đó cái gọi là phong bì ảo. 226 00:09:42,970 --> 00:09:46,390 >> Cụ thể, các trình duyệt nên đề cập đến một phương pháp, giống như một get, 227 00:09:46,390 --> 00:09:47,830 hoặc bài, hoặc tương tự. 228 00:09:47,830 --> 00:09:50,610 Sau đó, nghĩa là một không gian, đại diện ở đây chỉ với sp 229 00:09:50,610 --> 00:09:54,110 do đó nó là rõ ràng rằng chúng tôi thực sự muốn có một không gian ở đây. 230 00:09:54,110 --> 00:09:58,430 Sau đó yêu cầu mục tiêu đó sẽ là một cái gì đó giống như /hello.HTML. 231 00:09:58,430 --> 00:09:59,940 Tiếp theo là một không gian khác. 232 00:09:59,940 --> 00:10:01,120 Tiếp theo là một phiên bản. 233 00:10:01,120 --> 00:10:04,300 Đó sẽ là một cái gì đó giống như HTTP / 1.1. 234 00:10:04,300 --> 00:10:07,360 Tiếp theo là C-R-L-F. Đó là một từ viết tắt bạn sẽ nhìn thấy rất nhiều 235 00:10:07,360 --> 00:10:08,350 trong đặc tả. 236 00:10:08,350 --> 00:10:11,810 Và đây chỉ là một cách ưa thích của nói r xuyệc ngược, dấu gạch chéo ngược n. 237 00:10:11,810 --> 00:10:14,210 Nói cách khác, vận chuyển trở lại, dòng mới. 238 00:10:14,210 --> 00:10:14,896 Hoặc thức ăn đường. 239 00:10:14,896 --> 00:10:16,020 Vận chuyển trở lại, thức ăn đường. 240 00:10:16,020 --> 00:10:17,980 Đó là những gì C-R-L-F có nghĩa. 241 00:10:17,980 --> 00:10:20,180 >> Bây giờ, trong khi đó, nếu chúng ta quay trở lại mã của chúng tôi, 242 00:10:20,180 --> 00:10:22,430 chúng ta hãy xem những gì còn lại để bạn có thể làm. 243 00:10:22,430 --> 00:10:26,350 Bên trong chính, cuối cùng, có một cuộc gọi đến một chức năng phân tích cú pháp. 244 00:10:26,350 --> 00:10:30,670 Mục đích của việc phân tích cú pháp là để đi mà dòng đầu tiên, có nghĩa chúng tôi 245 00:10:30,670 --> 00:10:34,590 chỉ thấy trên các đặc điểm kỹ thuật, và trích xuất cái gọi là đường dẫn tuyệt đối 246 00:10:34,590 --> 00:10:35,420 và truy vấn. 247 00:10:35,420 --> 00:10:37,710 Bây giờ hãy nhìn vào spec cho những gì chúng tôi có nghĩa là bằng cách đó. 248 00:10:37,710 --> 00:10:41,380 >> Tuy nhiên trong ngắn câu chuyện dài, điều này ở đây, yêu cầu mục tiêu, 249 00:10:41,380 --> 00:10:44,670 là một chuỗi có thể được chia thành hai phần. 250 00:10:44,670 --> 00:10:47,680 Hoặc một đường dẫn tuyệt đối như /hello.HTML. 251 00:10:47,680 --> 00:10:49,590 Tiếp theo là một dấu hỏi tùy chọn. 252 00:10:49,590 --> 00:10:52,840 Và sau đó một cái gì đó giống như q bằng mèo, hoặc q bằng con chó, 253 00:10:52,840 --> 00:10:55,760 hoặc bất kỳ số lượng giá trị quan trọng cặp mà chúng ta thấy trong bài giảng 254 00:10:55,760 --> 00:10:59,420 là một phần của tham số của một yêu cầu HTTP. 255 00:10:59,420 --> 00:11:02,150 >> Vì vậy, những gì bạn sẽ cần làm là thực hiện phân tích cú pháp. 256 00:11:02,150 --> 00:11:05,790 Và tìm ra cách để lặp qua dòng, mà chỉ là đối số đầu tiên 257 00:11:05,790 --> 00:11:06,890 rằng chúng ta đang đi trong. 258 00:11:06,890 --> 00:11:09,270 Nhân vật cho nhân vật cho nhân vật. 259 00:11:09,270 --> 00:11:11,500 Chỉ có đi lên đến hết chuỗi đó. 260 00:11:11,500 --> 00:11:15,430 Tìm kiếm cho rằng đường dẫn tuyệt đối và tìm kiếm truy vấn. 261 00:11:15,430 --> 00:11:18,880 Và những gì tốt đẹp về một thực tế là chúng tôi đã đưa cho bạn trong tài liệu 262 00:11:18,880 --> 00:11:21,460 định nghĩa ngữ pháp này của dòng đầu tiên, 263 00:11:21,460 --> 00:11:24,230 ở đây bạn sẽ phải tìm ra, tốt, là những gì phương pháp. 264 00:11:24,230 --> 00:11:25,170 Là hợp lệ hay không? 265 00:11:25,170 --> 00:11:27,460 Và chúng tôi cho bạn trong spec khi nó là hoặc là không hợp lệ. 266 00:11:27,460 --> 00:11:29,120 Nhận được, ví dụ, sẽ có hiệu lực. 267 00:11:29,120 --> 00:11:30,580 Không gian sẽ được dễ dàng để kiểm tra. 268 00:11:30,580 --> 00:11:34,460 Chỉ cần sử dụng tuần hai phong cách hay vấn đề thiết lập hai kiểu chuỗi kiểm tra. 269 00:11:34,460 --> 00:11:35,710 Hoặc nhân vật kiểm tra. 270 00:11:35,710 --> 00:11:37,570 >> Yêu cầu mục tiêu là điều bạn sẽ muốn phân tích. 271 00:11:37,570 --> 00:11:39,907 Vì vậy, hãy nhìn vào spec cho những gì mong đợi ở đó. 272 00:11:39,907 --> 00:11:41,740 Và rồi cuối cùng, HTTP phiên bản, bạn chỉ muốn 273 00:11:41,740 --> 00:11:44,931 để chắc chắn rằng nó là một trong những phiên bản hỗ trợ như HTTP 1.1. 274 00:11:44,931 --> 00:11:47,430 Vì vậy, về cơ bản là một chức năng phân tích cú pháp của sẽ là một cơ hội 275 00:11:47,430 --> 00:11:50,013 chỉ cần đọc nhân vật điều này cho nhân vật cho nhân vật, 276 00:11:50,013 --> 00:11:53,900 hoặc chuỗi bằng chuỗi, đảm bảo rằng nó phù hợp với đặc điểm kỹ thuật này. 277 00:11:53,900 --> 00:11:54,900 Được rồi, trở lại chính. 278 00:11:54,900 --> 00:11:55,858 Hãy xem những gì còn lại. 279 00:11:55,858 --> 00:11:58,230 Vì vậy, giả sử bạn đã bây giờ thực hiện chức năng phân tích cú pháp của bạn. 280 00:11:58,230 --> 00:12:01,500 Chúng tôi đã phân tích ra từ nó cái gọi là đường dẫn tuyệt đối và truy vấn, 281 00:12:01,500 --> 00:12:03,520 những gì không chính bây giờ phải làm gì với điều này? 282 00:12:03,520 --> 00:12:05,440 Vâng, một, bạn sẽ thấy trong code mà chúng ta URL 283 00:12:05,440 --> 00:12:09,420 giải mã trong trường hợp trình duyệt có mã hóa nhất định ký tự đặc biệt 284 00:12:09,420 --> 00:12:12,670 và cách đặc biệt, chúng tôi đi trước và chuyển đổi những người trở lại 285 00:12:12,670 --> 00:12:14,640 với các nhân vật Ascii thích hợp. 286 00:12:14,640 --> 00:12:20,110 >> Sau đó chúng tôi đi trước và tìm ra nếu người dùng đã yêu cầu /hello.HTML, 287 00:12:20,110 --> 00:12:21,859 những tập tin làm họ thực sự nghĩa là gì? 288 00:12:21,859 --> 00:12:24,150 Nói cách khác, chúng ta cần phải tận gốc rễ của các máy chủ, 289 00:12:24,150 --> 00:12:27,550 rằng đường dẫn đến thư mục công cộng, và nối nó với một cái gì đó như thế, 290 00:12:27,550 --> 00:12:28,840 hello.HTML. 291 00:12:28,840 --> 00:12:31,240 Vì vậy mà chúng tôi có một lớn hơn chuỗi đó dẫn chúng ta chính xác 292 00:12:31,240 --> 00:12:37,220 đến tập tin thực tế về hello.HTML IDEs CS50 ổ cứng, hoặc đĩa. 293 00:12:37,220 --> 00:12:39,730 >> Tiếp theo, chúng ta kiểm tra các con đường thực sự tồn tại. 294 00:12:39,730 --> 00:12:42,017 Nếu không chúng ta ném một 404 lỗi cho người sử dụng. 295 00:12:42,017 --> 00:12:43,850 Và, trên thực tế, trong suốt mã của chúng tôi bạn sẽ thấy 296 00:12:43,850 --> 00:12:46,630 rất nhiều công dụng của lỗi này chức năng mà tôi, chúng mình đã viết, 297 00:12:46,630 --> 00:12:48,520 và đặc điểm kỹ thuật bạn đi qua. 298 00:12:48,520 --> 00:12:52,640 Đây chỉ là một cách để trở về một cái gì đó khác hơn 200 cho người dùng. 299 00:12:52,640 --> 00:12:55,790 >> Bây giờ xuống đây, tôi đi trước và hình dung ra là những gì người dùng 300 00:12:55,790 --> 00:12:58,670 đã yêu cầu một tập tin, hoặc một thư mục. 301 00:12:58,670 --> 00:13:01,290 Bởi vì nếu đó là một thư mục, tôi muốn làm một vài điều. 302 00:13:01,290 --> 00:13:08,980 Một, nếu người dùng truy cập một URL mà là cho một thư mục, 303 00:13:08,980 --> 00:13:11,920 nhưng không kết thúc bằng một dấu gạch chéo, vì những lý do thông thường, 304 00:13:11,920 --> 00:13:15,310 Tôi muốn chắc chắn rằng chúng ta thay đổi URL để thực sự kết thúc trong một dấu gạch chéo. 305 00:13:15,310 --> 00:13:17,770 Và như vậy bạn sẽ thấy trong nguồn mã mà chúng tôi đã đưa cho bạn, 306 00:13:17,770 --> 00:13:21,980 chúng ta buộc người dùng phải chuyển hướng đến không [? fu?] nhưng [? fu /,?] nếu họ đã thực hiện 307 00:13:21,980 --> 00:13:22,480 cái kia. 308 00:13:22,480 --> 00:13:24,440 Và xem các đặc điểm kỹ thuật cho phù hợp. 309 00:13:24,440 --> 00:13:26,120 >> Trong khi đó, chúng tôi kiểm tra một điều khác. 310 00:13:26,120 --> 00:13:30,110 Nếu người dùng đã truy cập một thư mục và thư mục đó 311 00:13:30,110 --> 00:13:35,240 chứa một tập tin gọi là index.html hoặc index.php, theo quy ước của con người 312 00:13:35,240 --> 00:13:37,840 chúng tôi không muốn để cho họ thấy nội dung của thư mục đó. 313 00:13:37,840 --> 00:13:41,990 Chúng tôi muốn cho họ thấy các nội dung của tập tin mặc định, index.html, 314 00:13:41,990 --> 00:13:43,640 hoặc index.php. 315 00:13:43,640 --> 00:13:45,750 Và do đó, các mã tôi đã nêu bật tại đây cuộc gọi 316 00:13:45,750 --> 00:13:48,430 một chức năng gọi là chỉ số mà chỉ đơn giản kiểm tra, 317 00:13:48,430 --> 00:13:53,610 không có tồn tại một tập tin ở đây gọi là index.html hoặc index.php. 318 00:13:53,610 --> 00:13:55,830 >> Nếu không, nếu không có những điều kiện áp dụng 319 00:13:55,830 --> 00:13:57,920 chúng ta chỉ cần gọi hàm danh sách, mà chúng tôi đã viết, 320 00:13:57,920 --> 00:14:00,280 mà theo nghĩa đen liệt kê các nội dung của một thư mục. 321 00:14:00,280 --> 00:14:03,680 Tất cả các quyền, và những gì nếu yêu cầu rằng trình duyệt của người dùng đã thực hiện 322 00:14:03,680 --> 00:14:05,830 không phải là một thư mục, nhưng đối với một tập tin? 323 00:14:05,830 --> 00:14:07,980 Vâng, đầu tiên chúng ta gọi một chức năng tra cứu. 324 00:14:07,980 --> 00:14:10,750 Đó là sẽ nói với các máy chủ, là này một JPEG, là này 325 00:14:10,750 --> 00:14:13,770 một tập tin HTML, là một này GIF, hoặc một số định dạng khác. 326 00:14:13,770 --> 00:14:17,300 Nếu vậy, nó sau đó sẽ kiểm tra, tốt, nó là một tập tin PHP. 327 00:14:17,300 --> 00:14:20,060 Nếu vậy, chúng tôi muốn gọi một chức năng gọi là giải thích, chúng ta đã viết, 328 00:14:20,060 --> 00:14:22,540 mà giải thích rằng tập tin PHP và thốt ra những kết quả. 329 00:14:22,540 --> 00:14:24,941 Hoặc, compellingly hơn, nếu nó là bất cứ điều gì khác, 330 00:14:24,941 --> 00:14:26,690 chúng ta hãy đi trước và chỉ cần chuyển các tập tin. 331 00:14:26,690 --> 00:14:29,680 Giống như GIF hoặc JPEG từ máy chủ cho người sử dụng, 332 00:14:29,680 --> 00:14:33,750 như thể họ yêu cầu một trang HTML, hình ảnh, hoặc bất kỳ số thứ khác. 333 00:14:33,750 --> 00:14:37,920 >> Cuối cùng, nếu không có gì khác có vẻ làm việc, chúng tôi chỉ cần đi để nói 501. 334 00:14:37,920 --> 00:14:42,190 Đó là 501, không được thực hiện tin nhắn, có nghĩa là các máy chủ 335 00:14:42,190 --> 00:14:44,230 chưa được hoàn thành.