User Tag List

+ Trả lời chủ đề
Trang 1/3 123 CuốiCuối
Hiện kết quả từ 1 tới 10 của 24

Chủ đề: Tìm hiểu về LINUX

  1. #1
    Acgiuna
    Guest

    Mặc định Tìm hiểu về LINUX

    Các bác có thể download sách học ở đây(bằng tiếng Anh)

  2. #2
    Acgiuna
    Guest

    Mặc định

    Shell là gì ?


    Khi bắt đầu với Linux các bạn thường nghe đến từ Shell…Okies vậy Shell là gì ?

    I Shell là gì ?

    Shell là chương trình giữa bạn và Linux (hay nói chính xác hơn là giữa bạn với nhân Linux). Mỗi lệnh bạn gõ ra sẽ được Shell diễn dịch rồi chuyển tới nhân Linux. Nói một cách dễ hiểu Shell là bộ diễn dịch ngôn ngữ lệnh, ngoài ra nó còn tận dụng triệt để các trình tiện ích và chương trình ứng dụng có trên hệ thống…

    II Các loại Shell thong dụng…

    Trong thế giới Unix/Linux có rất nhiều Shell…

    1) Shell Bourne (sh)
    Do Steven Bourne viết, đó là Shell nguyên thuỷ có mặt trên hầu hết các hệ thống Unix/Linux…Nó rất hữu dụng cho việc lập trình Shell nhưng nó không xử lý tương tác người dung như các Shell khác…

    2) Bourne Again Shell (bash)
    Đây là phần mở rộng của sh, nó kế thừa những gì sh đã có và phá huy những gì sh chưa có…Nó có giao diện lập trình rất mạnh và linh hoạt…Cùng với giao diện lệnh dễ dung…Đây là Shell được cài đặt mặc định trên các hệ thống Linux.

    3) Shell C (csh)
    Đáp ứng tương thích cho người dung…Nó hỗ trợ rất mạnh cho những Programmer C…và với đặc tính tự động hoàn thành dòng lệnh…

    4) Shell Korn (ksh)
    Có thể nói đây là một Shell tuyệt vời, nó kết hợp tính năng ưu việt của sh và csh…

    Ngoài ra còn có một số Shell khác như: ssh, nfssh, mcsh…

    MC (Midnight Commander) một Shell thực hiện yêu cầu của người dung thông qua môi trường đồ họa…Tương tự như NC (Norton Commander) trong DOS…

    Linux shell utils :

    Hôm nay mình xin nói về cách dùng các lệnh trong Unix . Khi các bạn đột nhập vào 1 hệ thống Unix hay cài đơc 1 Comandos Shell , hoặc khi chơi wargame thì hẳn không thể thiếu các lệnh dùng để khai thác hệ thống . Minh giới thiệu sơ qua .

    1 . lệnh " man" : Khi bạn muốn biết cách sử dụng lệnh nào thì có thể dùng tới lệnh nay :
    Cấu trúc lệnh : $ man ; Ví dụ : $ man man

    2. lệnh " uname ": cho ta biết các thông tin cơ bản về hệ thống
    Ví dụ : $uname -a ; nó sẽ đa ra thông tin sau :
    Linux gamma 2.4.18 #3 Wed Dec 26 10:50:09 ICT 2001 i686 unknown

    3. lệnh id : xem uid/gid hien tai ( xem nhóm và tên hiện tại )

    4.lệnh w : xem các user đang login và action của họ trên hệ thống
    Ví Dụ : $w nó sẽ đưa ra thônh tin sau :
    101pm up 25 days, 4:07, 18 users, load average: 0.06, 0.01, 0.00

    4. lệnh" cat, more ": in nội dung file ra màn hình
    Vidu : $cat /etc/passwd | more --> nó sẽ đưa ra nội dung file passwd một cách nhanh
    $more /etc/passwd ----> Nó sẽ đa ra nội dung file passwd một cách từ từ

    5. lệnh ps: xem thông tin các process trên hệ thống
    Ví dụ : $ps axuw

    6.lệnh ls: liệt kê nội dung thư mục
    Ví dụ : $ls -laR /

    7. lệnh pwd: in ra thư mục hiện hành
    Ví dụ : $pwd ----> nó sẽ cho ta biết vị trí hiện thời của ta ở đâu : /home/level1

    8. cac lệnh : cp, mv, rm có nghĩa là : copy, move, delete file

    Ví dụ với lệnh rm (del) : $rm -rf /var/tmp/blah ----->nó sẽ del file blah
    Tơng tự đố với các lệnh cp , mv

    9. lệnh find : tìm kiếm file, thư mục
    Ví dụ : $find / -user level2

    10. grep: công cụ tìm kiếm, so trùng theo mẫu, cách sử dụng đơn giản nhất : grep "something"
    Vidu : $ps axuw | grep "level1"

    11. strings: in ra tất cả các ký tự in được trong 1 file. Dùng nó để tìm các khai báo hành chuỗi trong chương trình, hay các gọi hàm hệ thống, biết đâu tìm được ... password
    Ví dụ : $strings /usr/bin/level1

    12 . lệnh strace: (linux) trace các gọi hàm hệ thống và signal, cực kỳ hữu ích để theo dõi flow của chương trình, cách nhanh nhất để xác định chương trình bị lỗi ở đoạn nào. Trên các hệ thống unix khác, tool tương đương là truss, ktrace
    Ví dụ : $strace /usr/bin/level1

    13 . lệnh hexdump : in ra cac gia tri tuong ung theo ascii, hex, octal, decimal cua du lieu nhap
    Ví dụ : $echo AAAA | hexdump

    14 . lệnh printf: in du lieu co dinh dang, giong nhu su dung printf() cua C
    Ví dụ : $printf %s "\x41\x41\x41\x41"

    15 . lệnh : cc, gcc, make, gdb: cac cong cu bien dich va debug
    Ví dụ : $gcc -o -g bof bof.c
    Ví dụ : $make bof
    Ví dụ : $gdb level1
    (gdb) break main
    (gdb) run

    16 . lệnh perl: một ngôn ngữ nhưng quá phức tạp, chỉ cần biết cái này trước
    Ví dụ : $perl -e 'print "A"x1024' | ./bufferoverflow ( Lỗi tràn bộ đệm khi ta đa vào 1024 kí tự )

    17 . lệnh "bash" : đã đến lúc tự động hoá các tác vụ của bạn bằng shell script, cực mạnh và linh hoạt

    Bạn muốn tìm hiểu về bash , ok hay xem nó như thế nào : $man bash

    18 . lệnh cd : bạn muốn di chuyển đến thư mục nào . phải nhờ đén lệnh này .
    Ví du : $ cd /usr/bin ----> nó sẽ đa bạn đến bin

    19 . lệnh mkdir : tạo 1 thư mục .
    Ví dụ : $ mkdir /home/microsoftvn ---> nó sẽ tạo 1 thư mục microsoftvn trong /home

    20 . lệnh rmdir : gỡ bỏ thư mục
    Ví dụ : $ rmdir /home/microsoftvn ----> nó sẽ gỡ bỏ thư mục microsoftvn

    21 . lệnh ls : Xem nội dung thư mục ( Liệt kê file trong thư mục )
    Ví Dụ : $ ls /home ----> se hiện toàn bộ file trong th muc Home

    $ ls -a -----> hiện toàn bộ file , bao gồm cả file ẩn
    $ ls -l -----> đưa ra thông tin về các file

    22. Lệnh ghi dữ liệu đầu ra vào 1 file .
    Vídụ : $ ls /urs/bin > ~/microsoftvn ------> ghi dữ liệu hiển thị thông tin của thư mục bin vào 1 file microsoftvn .

  3. #3
    Acgiuna
    Guest

    Mặc định

    Đặt quyền cho files trong Unix

    Bài viết này sẽ giúp bạn hiểu rõ về cách đặt quyền cho files trong môi trường Unix*(Linux*)! Chúng ta hãy bắt đầu!

    Unix* coi mọi thứ đều là file!

    Mọi thứ từ file, directory, device, socket,... Unix đều coi chúng là files! Hãy nhớ lấy điều này!

    Những gì bạn phải nhớ!

    Trước khi đi vào phần chính, tôi muốn bạn PHẢI ghi nhớ lấy các quyền sau:

    4 -> Read - đọc
    2 -> Write - viết
    1 -> Execute - thực thi

    4000 -> SUID - Set User ID on execution
    2000 -> SGID - Set Group ID on execution
    1000 -> Sticky Bit

    (Tôi sẽ giải thích chi tiết cho các bạn sau&#33

    Các thuộc tính của 1 file

    Cũng giống như MS-DOS, bất kì file nào trên Unix đều có các thuộc tính-attributes. Cấu trúc của 1 attribute trong Unix bao gồm 10 cờ-flags:

    ft ur uw ux gr gw gx or ow ox

    ft - file type: cho biết file thuộc loại gì. File type có thể là -(file bình thường), d(directory), l(symbolic link), c(character device), b(block device), socket device).
    các chữ viết tắc:
    u=user, g=group, o=other
    r=read, w=write, e=execute
    +=đặt, -=gỡ bỏ
    user(người dùng), group(nhóm) và other(những người khác) sẽ có các quyền hạn khác nhau trên một file nào đó. Quyền này chỉ có thể do người sở hữu file(onwer) hoặc root(admin) đặt thôi!

    Hãy nhìn qua các ví dụ sau, bạn sẽ hiểu được thôi!

    -rw-r--r-- 1 huy 2520 Jan 9 09:46 .plan
    lrwxrwxrwx 1 root 9 Oct 1 19:42 .rhosts -> /dev/null
    drwx------ 4 anh 4096 Jan 9 10:29 bin/
    -rw------- 1 anh 1349 Jan 6 14:49 header.file.2

    .plan là một file(-) thuộc quyền sở hữu của user huy. huy có quyền đọc và viết đối với file .plan(rw). Nhóm mà huy là một thành viên chỉ có quyền đọc file này(r--). Những người khác cũng chỉ có quyền đọc file .plan của huy thôi(r--)!
    .rhosts là một liên kết đến /dev/null(l)(liên kết trong Unix cũng gần tương tự như shortcut trong Windows thôi! Chắc bạn có thể hình dung ra được chứ&#33. .rhosts thuộc quyền sở hữu của root. root(uid=0), root group(gid=0) và những người khác(other) đều có quyền đọc, viết, ghi, thực thi trên liên kết .rhosts(rwxrwxrwx)!
    header.file.2 là một file(-) thuộc quyền sở hữu của user anh. anh có chỉ quyền đọc và ghi(rw-), những người khác(dĩ nhiên là ngoại trừ root và root-group) đều không có quyền gì cả trên file này(------)!
    Đặt quyền cho file bằng lệnh chmod

    chmod cho phép đặt quyền theo 2 cách: một là dùng các kí tự, hai là dùng số!

    Dùng kí tự:
    dấu "+" nghĩa là đặt, dấu "-" nghĩa là gỡ bỏ quyền! Ví dụ tôi có một file 'readme' có permission là -rw-r--r--(nghĩa là tôi(user) có quyền đọc và ghi đối với file này wr-, nhóm của tôi và nhũng người khác chỉ có thể đọc nó r-- và r--). Bây giờ tôi muốn cho nhóm tôi và những người khác có thêm quyền thực thi file này:

    chmod go+x readme

    Permission của file readme sẽ là -rw-r-xr-x

    Giờ thì tôi lại đổi ý, tôi muốn nhóm của tôi có thêm quyền ghi đối với file 'readme' của tôi và những người khác chỉ có quyền thực thi:

    chmod g+w readme
    chmod o-r readme

    Permission của file readme sẽ là -rw-rwx--x

    Dùng số:
    4 -> Read - đọc
    2 -> Write - ghi
    1 -> Execute - thực thi

    Bạn cần đặt quyền gì thứ cứ cộng các giá trị này lại với nhau. Ví dụ 4+2=6 tức là đọc và ghi; 4+1=5 tức là đọc và thực thi; 4+2+1=7 nghĩa là đọc, ghi và thực thi; 0 nghĩa là không có quyền gì hết...!

    user group other

    Số thứ nhất cho user
    Số thứ nhất cho group
    Số thứ nhất cho other

    Ví dụ:

    chmod 744 a -> user có quyền đọc, ghi, thực thi a rwx(4+2+1=7); group và other chỉ có quyền đọc và ghi a rw-(4)
    chmod 755 hello.pl -> user có quyền đọc, ghi, thực thi hello.pl rwx(4+2+1=7); group và other chỉ có quyền đọc và thực thi hello.pl r-x(4+1=5)

    Nói thêm: chmod cho phép bạn đặt quyền cho nhiều file cùng một lúc. Bạn có thể dùng các kí tự đại diện chảng hạn như *, .... Tham số -R (viết tắc của từ recursive - đệ qui) dùng để đặt quyền cho tất cả các file và thư mục cấp dưới!(à quyên, tôi phải nói là file mới phải chứ&#33

    [root@localhost cgi-bin]$chmod -R 755 * -> đặt quyền "rwxr-x-r-x" cho tất cả các files trong thư mục cgi-bin và các thư mục con của cgi-bin. Tuy nhiên, lệnh này sẽ không đặt quyền "rwxr-x-r-x" cho các file bắt đầu bằng dấu chấm '.' Để đặt quyền "rwxr-x-r-x" cho các file này, bạn gõ thêm lệnh sau:

    [root@localhost cgi-bin]$chmod -R 755 .* -> Okay!

    SUID, SGID, Sticky bit là gì?

    Tôi sẽ giải thích cho bạn bây giờ! Không khó hiểu lắm đâu..!

    user group other

    Số thứ 0 chính là để dùng cho SUID, SGID và Sticky bit!

    SUID -> 4000
    SGID -> 2000
    Sticky bit -> 1000

    (Xin bạn chú ý, 3 số sau tôi cho bằng 000 hết vì chúng ta không quan tâm đến user, group, other. Chúng ta chỉ để ý đến số thứ 0 thôi! Bạn đừng có nhầm lẫn giữa 4000 với 4 nghe chưa&#33

    SUID - Set User ID on execution là gì? Tôi giải thích rõ cho bạn qua ví dụ sau: user huy có một file chương trình có tên là lamviec. Để có thể chạy được, lamviec phải truy cập đến vài thứ trong file dulieu. File dulieu thuộc quyền sở hữu của huy. Như vậy thì huy có thể chạy được lamviec mà không gặp phải vấn đề gì. Tuy nhiên, bây giờ nếu có một người bạn của huy là anh không ở cùng nhóm với huy cần chạy file lamviec! anh sẽ không thể nào chạy được file lamviec bởi vì nó cần truy cập đến file dulieu của huy, mà file này lại không thuộc quyền sở hữu của anh. huy sẽ chmod o+wr cho file dulieu! Làm như vậy thì người khác sẽ đọc và ghi được file này răng! Hihi, huy sẽ SUID cho file lamviec bằng lệnh chmod +s lamviec. Bây giờ thì lamviec sẽ chạy với userid là huy, anh có thể chạy được file lamviec mà không gặp phải vấn đề gì. Tuy nhiên anh chỉ có thể đọc hoặc viết vào file dulieu thông qua lamviec. anh không thể nào có thể đọc hoặc ghi lên file dulieu trực tiếp trừ phi anh có quyền root!

    SGID - Set User ID on execution là gì? Nghĩa là đặt thuộc tính thừa kế groupid cho một thư mục nào đó. Ví dụ, khi tôi đã sgid cho thư mục abc bằng lệnh chmod 2766 abc thì sau đó, bất kì một người này dù cùng group-id hoặc khác group-id với tôi nếu tạo file nào đó trong thư mục abc của tôi thì file đó sẽ có group-id của tôi, không phải là group-id của người đó!

    Sticky bit - cái này có ý nghĩa khác nhau đối với file và thư mục:

    Đối với file, sticky bit thường chỉ được dùng với các thực thi thôi và thường thì chỉ có root hoặc các users có quyền hạn cao mới được bật hay tẳt sticky bit cho file! Khi một file thực thi có sticky bit được bật, file này sẽ được nạp vào swap-space(không gian swap) của Unix để có thể chạy nhanh. Bạn hãy để ý, các chương trình như vi, vim, pico, pine thường được bật sticky bit vì người dùng thường sử dụng các chương trình này thường xuyên mà!

    Đối với thư mục, khi một thư mục được bật sticky bit thì các users có thể đọc hoặc viết vào các file trong thư mục đó. Tuy nhiên, họ không thể đổi tên hoặc xóa các file không thuộc quyền sở hữu của họ. Họ chỉ có thể xóa hoặc đổi tên các file do họ tạo ra mà thôi. Thường thì sticky bit được dùng trong thư mục /tmp nhằm tăng thêm tính private cho các users!
    Hack permissions!

    Đôi khi admin hoặc một số users cẩu thả khi đặt quyền cho các files của họ. Họ đã tự mang họa vào thân mà chẳng hay gì hết!? Hãy xem các ví dụ sau:

    Tìm tất cả các file thuộc quyền sở hữu của root đã được bật sticky bit: $> find / -user root -perm -4000 -ls
    Tìm tất cả các file được quyền ghi: $> find -type f -perm -2 -ls
    Tìm tất cả các thư mục được quyền ghi: $> find -type d -perm -2 -ls
    Một số hackers sau khi đã lấy được quyền root rồi thường kéo file sh vào thư mục /tmp/somewhere, sau đó bật sticky bit cho file này để Unix* nạp nó lên swap-space. Như vậy nó sẽ chẳng bao gì bị xóa cho đến khi server bị restart lại mà điều này thì hiếm khi xảy ra! Khi muốn hackers có thể ghé thăm lại server này cho vui!

    #> cp /sbin/sh /tmp/somewhere/yeah
    #> chmod 4755 /tmp/somewhere/yeah

    Qua bài này tôi hi vọng rằng bạn sẽ có thêm một số kiến thức mới và dĩ nhiên là hiểu được sự phân quyền trên Unix*. Chúc bạn thành công! Oh! I can relax now...?!

  4. #4
    Acgiuna
    Guest

    Mặc định

    Cơ bản về lập trình C Socket trên UNIX
    BracaMan

    Giới thiệu

    Các loại sockets

    Structures

    Network Byte Order

    Địa chỉ IP

    Các hàm quan trọng

    Vài lời về DNS

    Một ví dụ về stream server

    Một ví dụ về stream client

    Kết thúc


    --------------------------------------------------------------------------------


    Giới thiệu

    Trên Windows, winsock được nhiều người sử dụng để lập trình mạng trên Windows. Vậy trong UNIX thì sao?&#33; Bài viết này sẽ hướng dẫn cho bạn cách lập trình C Socket trên UNIX. Tuy nhiên, chỉ là cơ bản thôi&#33; <


    --------------------------------------------------------------------------------

    Các loại sockets

    Mọi thứ từ file, directory, device, terminal, ... đến socket đều được coi là files. Trong quá trình xử lí file, bao gồm đọc và ghi, nói ngắn gọn là I/O, file được UNIX quản lí thông qua một số nguyên không dấu gọi là file descriptor. File descriptor trên UNIX cũng hệt như file handler trong MSDOS vậy.

    Một máy tính muốn kết nối với máy tính khác trong mạng, trước hết nó phải tạo sockets. Các máy tính gởi và nhận dữ liệu thông qua sockets.

    Có hai loại socket: stream sockets(SOCK_STREAM) và datagram sockets(SOCK_DGRAM). Stream sockets sử dụng giao thức TCP(Transmission Control Protocol) nên rất đáng tin cậy. Stream thường được dùng để chuyển các dữ liệu lớn trên mạng hoặc khi bạn cần chuyển các gói dữ liệu nối tiếp nhau(thứ tự của các gói dữ liệu(packets) là điều quan trọng nhất). Ví dụ, bạn có 3 gói dữ liệu "A,B,C", stream sockets sẽ chuyển theo đúng thứ tự "A,B,C". Datgram sockets cung cấp một phương pháp chuyển dữ liệu đơn giản hơn và nhanh hơn stream sockets. Datagram sockets dựa trên UDP(User Datagram Protocol), không đáng tin cậy so với TCP. Dữ liệu có thể không đến được đích, không nối tiếp nhau(packets được chuyển đi không theo đúng thứ tự) hoặc bị lặp lại nhiều lần(socket đích có thể nhận được một hoặc nhiều packets trùng nhau). HTTP, FTP và một số protocols khác sử dụng stream sockets, trong khi broadcast protocols dùng datagram sockets. <


    --------------------------------------------------------------------------------

    Structures

    1/ struct sockaddr: lưu các thông tin về socket

    struct sockaddr{
    unsigned short sa_family; /* address family */
    char sa_data[14]; /* 14 bytes of protocol address */
    };
    2/ struct sockaddr_in(in -> INternet): reference của struct sockaddr

    struct sockaddr_in {
    short int sin_family; /* Address family */
    unsigned short int sin_port; /* Port */
    struct in_addr sin_addr; /* Internet Address */
    unsigned char sin_zero[8]; /* Same size as struct sockaddr */
    };
    sin_family = AF_INET;

    sin_zero[] = được lắp đầy bằng các giá trị 0(sử dụng hàm memset() hoặc bzero(), xem các ví dụ dưới.)

    Xin bạn lưu ý, hai cấu trúc sockaddr & sockaddr_in giống y như nhau&#33; Vì vậy, bạn hoàn toàn có thể ép kiểu(typecasting) giữa struct sockaddr và struct sockaddr_in&#33;

    struct in_addr {
    unsigned long s_addr;
    };
    3/ struct hostent: được dùng để lấy các thông tin về remote host.

    struct hostent
    {
    char *h_name; /* Official name of host. */
    char **h_aliases; /* Alias list. */
    int h_addrtype; /* Host address type. */
    int h_length; /* Length of address. */
    char **h_addr_list; /* List of addresses from name server. */
    #define h_addr h_addr_list[0] /* Address, for backward compatibility. */
    };

    struct hostent đã được định nghĩa sẵn trong file header netdb.h <


    --------------------------------------------------------------------------------

    Network Byte Order

    Có hai loại sắp xếp byte: big Endian(từ trái sang phải) và little Endian(từ phải sang trái). Ví dụ địa chỉ IP 205.34.67.27 thì:

    little Endian: 205.34.67.27
    big Endian: 27.67.34.205

    Intel CPU sử dụng little Endian trong khi nhiều CPU khác như của Motorola lại dùng big Endian.

    little Endian = Host Byte Order
    big Endian = Network Byte Order

    Sau đây là một số hàm dùng để chuyển đổi giữa Host Byte Order và Network Byte Order:

    htons() -> "Host to Network Short"
    htonl() -> "Host to Network Long"
    ntohs() -> "Network to Host Short"
    ntohl() -> "Network to Host Long"
    Một điều quan trọng bạn cần phải nhớ là sin_addr và sin_port trong struct sockaddr_in phải luôn ở dạng Network Byte Order&#33; <


    --------------------------------------------------------------------------------

    Địa chỉ IP

    Trong C có một số hàm để thao tác với địa chỉ IP. Chúng ta đang nói về các hàm inet_addr() và inet_ntoa()

    inet_addr() dùng để chuyển địa chỉ IP sang dạng unsigned long. Ví dụ:

    dest.sin_addr.s_addr = inet_addr("195.65.36.12");
    /* dest là biến cấu trúc sockaddr_in */

    inet_ntoa() (number to ascii) dùng để chuyển IP address sang string. Ví dụ:

    char *IP;
    ip=inet_ntoa(dest.sin_addr);
    printf("Địa chỉ IP: %s&#092;n",ip);

    Hàm inet_addr() trả về địa chỉ ở dạng Network Byte Order nên bạn không cần phải gọi tiếp hàm htol(). <


    --------------------------------------------------------------------------------

    Các hàm quan trọng

    6.1 - socket()

    #include <sys/types.h>
    #include <sys/socket.h>

    int socket(int domain,int type,int protocol);
    Các tham số:

    domain = AF_INET(dùng APRA internet protocols) hoặc AF_INET(nếu bạn muốn tạo sockets cho các comunication inside)

    type = loại socket mà bạn dùng, SOCK_STREAM(đối với stream socket) hoặc SOCK_DGRAM(nếu dùng datagram socket).

    protocol = 0

    Hàm socket() trả về một socket descriptor nếu thành công hoặc -1 nếu gặp lỗi.



    6.2 - bind()

    #include <sys/types.h>
    #include <sys/socket.h>

    int bind(int fd, struct sockaddr *my_addr,int addrlen);
    Các tham số:

    fd = socket file descriptor được socket() trả về

    my_addr = con trỏ đến struct sockaddr

    addrlen = sizeof(struct sockaddr)

    bind() được dùng ở phía server(thường là trước khi gọi hàm listen()). bind() sẽ kết hợp một port cho socket. Nó trả về -1 nếu gặp lỗi. Các port dưới 1024 đã được system sử dụng, bạn chỉ nên bind đối với các port từ 1024 đến 65535.

    Ngoài ra bạn cũng có thể đặt địa chỉ IP và port một cách tự động như sau:

    server.sin_port = 0; /* bind() sẽ chọn một cổng random */
    server.sin_addr.s_addr = INADDR_ANY; /* tự động đặt địa chỉ IP của server */

    6.3 - connect()

    #include <sys/types.h>
    #include <sys/socket.h>

    int connect(int fd, struct sockaddr *serv_addr, int addrlen);
    Các tham số:

    fd = socket file descriptor do socket() trả về

    serv_addr = con trỏ đến struct sockaddr_in chứa địa chỉ IP đích và port.

    addrlen = sizeof(struct sockaddr)

    Hàm connect() dùng để kết nối đến 1 địa chỉ IP ở cổng port. Nó trả về -1 nếu gặp lỗi.



    6.4 - listen()

    #include <sys/types.h>
    #include <sys/socket.h>

    int listen(int fd,int backlog);
    Các tham số:

    fd = sock file descriptor do socket() trả về

    backlog = số kết nối được phép

    Hàm listen() được dùng để lắng nghe các kết nối đến. Bạn dùng hàm này nếu bạn muốn ai đó kết nối đến máy tính của bạn. Trước khi gọi listen(), bạn phải bind() hoặc chọn 1 cổng random. Đây là sơ đồ gọi hàm của một server:

    1/ socket()
    2/ bind()
    3/ listen()
    4/ accept() /* tôi sẽ giải thích với bạn sau */

    Cũng như các hàm ở trên, listen() trả về -1 nếu gặp lỗi.



    6.5 - accept()

    #include <sys/socket.h>

    int accept(int fd, void *addr, int *addrlen);
    Các tham số:

    fd = socket file descriptor do socket() trả về

    addr = con trỏ đến struct sockaddr_in sẽ chứa các thông tin về remote socket

    addrlen = sizeof(struct sockaddr_in)

    Khi một ai đó đang cố kết nối đến máy tính của bạn, bạn phải dùng hàm accept() để nhận kết nối đó. Một cách dễ hiểu: bạn chỉ nhận kết nối nếu bạn chấp nhận, accept.

    Ví dụ:

    ...
    sin_size=sizeof(struct sockaddr_in);
    if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* calls accept() */
    printf("accept() error&#092;n");
    exit(-1);
    }
    ...
    Kể từ lúc này, fd2 được dùng send() đến client hoặc recv() từ client



    6.6 - send()

    int send(int fd,const void *msg,int len,int flags);
    Các tham số:

    fd = socket descriptor cần gởi dữ liệu đến

    msg = con trỏ đến dữ liệu cần gởi

    len = kích thước của dữ liệu được gởi đi, tính theo bytes

    flags được đặt bằng 0

    send() gởi dữ liệu qua CONNECTED stream sockets(). Nếu bạn muốn gởi dữ liệu qua UNCONNECTED datagram sockets, bạn phải dùng hàm sendto()(xin xem phía dưới).

    send() trả về -1 nếu gặp lỗi.



    6.7 - recv()

    int recv(int fd, void *buf, int len, unsigned int flags);
    fd = socket descriptor cần đọc dữ liệu

    buf = buffer để lưư dữ liệu

    len = max length của buffer

    flags được đặt bằng 0

    Tương tự như trên, bạn phải gọi recvfrom() thay cho recv() nếu đang dùng UNCONNECTED datagram sockets.

    recv() trả về số bytes đã đọc được, nó sẽ trả về -1 nếu gặp lỗi.



    6.8 - sendto()

    int sendto(int fd,const void *msg, int len, unsigned int flags,
    const struct sockaddr *to, int tolen);
    fd giống như ở send()

    msg giống như ở send()

    len giống như ở send()

    flags giống như ở send()

    to = con trỏ đến struct sockaddr đích

    tolen = sizeof(struct sockaddr)

    Như bạn thấy, sendto() cũng gần giống như send(), nó chỉ có thêm 2 tham số là to và tolen. sendto() dùng cho UNCONNECTED datagram sockets, hàm này trả về số bytes đã gởi đi hoặc -1 nếu gặp lỗi.



    6.9 - recvfrom()

    int recvfrom(int fd,void *buf, int len, unsigned int flags
    struct sockaddr *from, int *fromlen);
    Các tham số:

    fd giống như ở recv()

    buf giống như ở recv()

    len giống như ở recv()

    flags giống như ở recv()

    from = con trỏ đến struct sockaddr nguồn

    fromlen = sizeof(struct sockaddr)

    recvfrom() trả về số bytes đã nhận, -1 nếu gặp lỗi.



    6.10 - close()

    close(fd);
    close() được dùng để đóng kết nối và giải phóng socket descriptor.



    6.11 - shutdown()

    int shutdown(int fd, int how);
    fd = socket file descriptor cần shutdown

    how là một trong các số sau:

    0 - disable nhận
    1 - disable gởi
    2 - disable gởi và nhận

    shutdown(fd,2) giống y hệt như close(fd).

    shutdown() trả về 0 nếu thành công, -1 nếu thất bại.



    6.12 - gethostbyname()

    #include <unistd.h>

    int gethostname(char *hostname, size_t size);
    Các tham số:

    hostname = con trỏ đến mảng chứa hostname

    size = chiều dài của mảng hostname.

    Hàm gethostname() được dùng để lấy hostname. <


    --------------------------------------------------------------------------------

    Vài lời về DNS

    DNS là chữ viết tắc của Domain Name Server. Về cơ bản, nó dùng để lấy địa chỉ IP của một hostname. Ví dụ, tôi cần biết địa chỉ IP của queima.ptlink.net, truy vấn DNS sẽ nhận được 212.13.37.13. Điều này rất quan trọng, bởi vì các hàm sockets như bind(), connect() chỉ làm việc với địa chỉ IP.

    Để bạn hiểu được làm cách nào tôi lấy được địa chỉ IP của queima.ptlink.net, bạn hãy xem chương trình C sau:

    /* <---- bat dau getip.c ----&#62; */

    #include <stdio.h>
    #include <netdb.h> /* gop file nay de co the dung gethostbyname() */
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>


    int main(int argc, char *argv[])
    {
    struct hostent *he;

    if (argc&#33;=2){
    printf("Cu phap: %s <hostname>&#092;n",argv[0]);
    exit(-1);
    }

    if ((he=gethostbyname(argv[1]))==NULL){
    printf("gethostbyname() error&#092;n");
    exit(-1);
    }

    printf("Hostname : %s&#092;n",he->h_name); /* print hostname */
    printf("Dia chi IP: %s&#092;n",inet_ntoa(*((struct in_addr *)he->h_addr))); /* print dia chi IP */
    }
    /* <---- ket thuc getip.c ----&#62; */
    <
    --------------------------------------------------------------------------------

    Một ví dụ về stream server

    /* <---- bat dau server.c ----&#62; */

    #include <stdio.h> /* cac files header thuong dung */
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>


    #define PORT 3550 /* cong se duoc mo */
    #define BACKLOG 2 /* so ket noi cho phep */

    main()
    {

    int fd, fd2; /* file descriptors */

    struct sockaddr_in server; /* thong tin ve dia chi cua server */
    struct sockaddr_in client; /* thong tin ve dia chi cua client */

    int sin_size;


    if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ /* calls socket() */
    printf("Loi socket()&#092;n");
    exit(-1);
    }

    server.sin_family = AF_INET;
    server.sin_port = htons(PORT); /* ban hay nho lai htons() o phan "Día chi IP"&#33; */
    server.sin_addr.s_addr = INADDR_ANY; /* INADDR_ANY dung de dat dia chi IP tu dong */
    bzero(&(server.sin_zero),8); /* lap day sin_zero bang 0 */


    if(bind(fd,(struct sockaddr*)&server,sizeof(struct sockaddr))==-1){ /* calls bind() */
    printf("Loi bind()&#092;n");
    exit(-1);
    }

    if(listen(fd,BACKLOG) == -1){ /* calls listen() */
    printf("Loi listen()&#092;n");
    exit(-1);
    }

    while(1){
    sin_size=sizeof(struct sockaddr_in);
    if ((fd2 = accept(fd,(struct sockaddr *)&client,&sin_size))==-1){ /* calls accept() */
    printf("Loi accept()&#092;n");
    exit(-1);
    }

    printf("Da nhan duoc mot ket noi tu %s&#092;n",inet_ntoa(client.sin_addr) ); /* print dia chi IP cua client */

    send(fd2,"Chao mung ban den voi server cua toi.&#092;n",40,0); /* goi loi chao den client */

    close(fd2); /* close fd2 */
    }
    }
    <
    --------------------------------------------------------------------------------

    Một ví dụ về stream client

    /* <---- bat dau client.c ----&#62; */

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <netdb.h> /* netbd.h dung cho struct hostent =) */

    #define PORT 3550 /* cong duoc mo tren remote host */
    #define MAXDATASIZE 100 /* so bytes du lieu toi da */

    int main(int argc, char *argv[])
    {
    int fd, numbytes; /* files descriptors */
    char buf[MAXDATASIZE]; /* buf dung de luu du lieu nhan duoc */

    struct hostent *he; /* he dung de luu cac thong tin ve remote host */
    struct sockaddr_in server; /* thong tin ve dia chi cua server */

    if (argc &#33;=2) { /* chuong trinh nhan dia chi IP cua remote host tu dong lenh */
    printf("Cu phap: %s <Dia chi IP>&#092;n",argv[0]);
    exit(-1);
    }

    if ((he=gethostbyname(argv[1]))==NULL){ /* calls gethostbyname() */
    printf("gethostbyname() error&#092;n");
    exit(-1);
    }

    if ((fd=socket(AF_INET, SOCK_STREAM, 0))==-1){ /* calls socket() */
    printf("Loi socket()&#092;n");
    exit(-1);
    }

    server.sin_family = AF_INET;
    server.sin_port = htons(PORT); /* htons() -> Network Byte Order */
    server.sin_addr = *((struct in_addr *)he->h_addr); /* lay dia chi IP */
    bzero(&(server.sin_zero),8);

    if(connect(fd, (struct sockaddr *)&server,sizeof(struct sockaddr))==-1){ /* calls connect() */
    printf("Loi connect()&#092;n");
    exit(-1);
    }

    if ((numbytes=recv(fd,buf,MAXDATASIZE,0)) == -1){ /* calls recv() */
    printf("Loi recv()&#092;n");
    exit(-1);
    }

    buf[numbytes]=&#39;&#092;0&#39;;

    printf("Thong diep tu server: %s&#092;n",buf); /* print loi chao mung tu server */

    close(fd); /* close fd =) */
    }

    /* <---- ket thuc client.c ----&#62; */

    >

  5. #5
    svBK's Newbie
    Tham gia ngày
    Feb 2007
    Bài gửi
    1

    Mặc định

    mình chưa hiểu về shell lắm
    vậy cho mình hỏi là tại sao lại cần nhiều shell thế để làm gì??
    và khi user gõ vào 1 lệnh thì shell nào sẽ diễn dịch lệnh user vừa gõ vào??hay là mỗi shell đãm nhiệm 1 nhiệm vụ diễn dịch 1 chương trình nào đó??

  6. #6
    Want to change the world Avatar của Inuyasha
    Tham gia ngày
    Nov 2005
    Bài gửi
    606

    Mặc định

    shell giống command.com trên DOS vậy, nhiệm vụ chung là diễn dịch các lệnh của người sử dụng gõ vào để thực thi các hàm của hệ thống. Còn thì vì sao lắm shell thì đó là nhu cầu của các nhà phát triển hệ thống, các loại đó nói chung chẳng khác nhau mấy, chỉ bổ sung thêm vài tính năng cho phù hợp với cách sử dụng của các cá nhân, tất cả khởi đầu từ shell sh của Unix.
    .



  7. #7
    Độc Thân Bang Hội Avatar của hienhyn
    Tham gia ngày
    Nov 2011
    Bài gửi
    691

    Mặc định Re: Tìm hiểu về LINUX

    Em cài xong ubuntu 11.10 từ usb xong, reboot theo yêu cầu để hoàn tất. Nhưng khi máy bắt đầu thì hiện lên một màn hình đen thui với dòng chữ:
    error: unknown filesystem
    entering rescue mode
    grub rescue>_
    Bây giờ cũng chẳng vào được win nữa
    Cho em hỏi đây là lỗi gì và phải sửa nó như thế nào?

  8. #8
    Điều hành viên Avatar của iexplore
    Tham gia ngày
    Sep 2010
    Bài gửi
    208

    Mặc định Re: Tìm hiểu về LINUX

    Quote Nguyên văn bởi hienhyn Xem bài viết
    Em cài xong ubuntu 11.10 từ usb xong, reboot theo yêu cầu để hoàn tất. Nhưng khi máy bắt đầu thì hiện lên một màn hình đen thui với dòng chữ:
    error: unknown filesystem
    entering rescue mode
    grub rescue>_
    Bây giờ cũng chẳng vào được win nữa
    Cho em hỏi đây là lỗi gì và phải sửa nó như thế nào?
    làm theo bài hướng dẫn sau nhé bạn
    http://nguyentieuhau.wordpress.com/2...i-lai-windows/

    nếu vẫn chưa được thì cho đĩa win vào repair lại nhé, có thể cài ubuntu song song windows cũng được

  9. Tớ cảm ơn iexplore đã chia sẻ.


  10. #9
    Độc Thân Bang Hội Avatar của hienhyn
    Tham gia ngày
    Nov 2011
    Bài gửi
    691

    Mặc định Re: Tìm hiểu về LINUX

    Mọi người cho em hỏi Ubuntu có chia sẻ mạng cho windows (và ngược lại) được không? Em đã thử rồi nhưng không được!

  11. #10
    .:: Grumpy svBKer ::. Avatar của 1973
    Tham gia ngày
    Mar 2010
    Bài gửi
    3.793

    Mặc định Re: Tìm hiểu về LINUX

    Quote Nguyên văn bởi hienhyn Xem bài viết
    Mọi người cho em hỏi Ubuntu có chia sẻ mạng cho windows (và ngược lại) được không? Em đã thử rồi nhưng không được!
    Ý của em là chia sẻ mạng qua sóng wifi hay là gì?
    Contact me:
    Email: sangnd [at] svBK.vn
    Personal website: My Blog | Chat với người lạ
    Facebook Page của Bách Khoa Forum: http://www.facebook.com/svbk.vn

+ Trả lời chủ đề
Trang 1/3 123 CuốiCuối

Thông tin chủ đề

Users Browsing this Thread

Hiện có 1 người đọc bài này. (0 thành viên và 1 khách)

Chủ đề tương tự

  1. Sử dụng Linux trên đĩa CD
    Gửi bởi Nistelrooy trong mục Hệ điều hành UNIX - Linux
    Trả lời: 1
    Bài cuối: 30-09-2011, 10:05 PM
  2. Linux và các ứng dụng đối với kĩ sư Điện-Điện Tử
    Gửi bởi Mr.vulh_bk trong mục Hệ điều hành UNIX - Linux
    Trả lời: 43
    Bài cuối: 08-05-2008, 11:58 PM
  3. Linux: Việt Nam & Thế giới
    Gửi bởi Nistelrooy trong mục Hệ điều hành UNIX - Linux
    Trả lời: 2
    Bài cuối: 07-10-2007, 12:17 PM
  4. Help me! Ko cài dc Linux trên máy tính xách tay.
    Gửi bởi chitbk trong mục Hệ điều hành UNIX - Linux
    Trả lời: 11
    Bài cuối: 20-02-2007, 10:42 PM
  5. ai biết về linux giúp mình với
    Gửi bởi bluto trong mục Hệ điều hành UNIX - Linux
    Trả lời: 5
    Bài cuối: 12-04-2006, 05:50 PM

Từ khóa (Tag) của chủ đề này

Quyền viết bài

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


About svBK.VN

    Bách Khoa Forum - Diễn đàn thảo luận chung của sinh viên ĐH Bách Khoa Hà Nội. Nơi giao lưu giữa sinh viên - cựu sinh viên - giảng viên của trường.

Follow us on

Twitter Facebook youtube