Ch運 và ch医p nh壱n k院t n嘘 i

Một phần của tài liệu ứng dụng bắt gói tin cho mạng quản trị (Trang 49 - 50)

M瓜t khi 8ã t衣o 8逢嬰c socket, 8員t tên cho nó và chu育n d鵜xong hàng

8嬰i 8吋 ti院p nh壱n k院t n嘘i, công vi羽c sau cùng là ch運 k院t n嘘i e栄a trình khách g穎i8院n.D衣ni丑i hàm accept()8吋th詠c hi羽n công vi羽c này.

#include <sys/socket.h>

int accept(int socketd, struct sockaddr *address, size_t *address_len);

Hàm h羽 th嘘ng accept() u胤 tr荏 v隠 khi có m瓜t trình khách mu嘘n k院t n嘘i v噂i 鰻 c逸m socket ch雨 8鵜nh s嘘 mô v違 socketd. K院t n嘘i e栄a trình khách tr逢噂c h院t 8逢嬰c 8員t vào hàng 8嬰i. Khi accept() phát hi羽n ra có socket trong hàng 8嬰i, nó s胤t詠 8瓜ng l医y 8鵜a ch雨 c栄a máy khách 8員t vào c医u trúc address, chi隠u dài th壱t s詠 c栄a c医u trúc 8鵜a ch雨 tr違 v隠 trong bi院n address_len. Ti院p 8院n accept()v衣o ra m瓜t socket vô danh. K院t qu違 tr違v隠 e栄a accept() là s嘘 mô v違 cho socket vô danh, d衣n có th吋 s穎 d映ng s嘘 này

8吋 liên n衣c v噂i trình khách. Socket vô danh m噂i này có cùng ki吋u v噂i socket 8員t tên 8ang l逸ng nghe trên hàng 8嬰i.

Do c医u trúc struct sockaddr không có8鵜nh cho nênd衣n c亥n thi院t l壱p kích th逢噂c v瑛a 8栄" 8吋 ti院p nh壱n 8鵜a ch雨 trình khách. N院u 8鵜a ch雨 trình khách dài h挨n không giand衣n dành cho c医u trúc sockaddr, ph亥n d逢 rau胤 d鵜c逸t d臼.

Ch逢挨ng 4: L壱p trình socket

N院u ch逢a có k院t n嘘i nào trong hàng 8嬰i, accept() u胤 d瑛ng n衣i ch運 – block( trình ch栄 s胤 không th詠c thi các l羽nh k院 ti院p) cho 8院n khi có k院t n嘘i e栄a client g穎i 8院n. Bàn có th吋thay 8鰻i c挨 ch院ch運 này b茨ng cách i丑i hàm fcntl() 8i隠u ch雨nh và thêm vào c運 O_NONBLOCK cho socket nh逢

sau:

int flags=fcntl(socketd, F_GETFL, 0);

fcntl(socketd, F_SETFL, O_NONBLOCK | flags);

Sau khi 8員t c運 này cho socket, hàm accept()u胤 không d瑛ngn衣i ch運

khi d衣ni丑i nó. accept()u胤 tr違v隠ngay s嘘môv違cho socket n院u có k院t n嘘i trong hàng 8嬰i, n院u không nó s胤 tr違v隠-1 và th詠c thi dòng l羽nh k院ti院p.

Một phần của tài liệu ứng dụng bắt gói tin cho mạng quản trị (Trang 49 - 50)