Sunteți pe pagina 1din 9

&'()*+%B,CD%

•  E;%F6/+%G'@=?%>'@%*H8*(+%G6*2%=*/-212.%/%2*G%I21H%
('00/2?%J!"#"$%&'K%D%%
/K  &'@-(*%('?*% !"#$%&'(%()*+,-)#.(*+/'#
!!"##$%&'()*+%,-'.-/0012.% <K  ,-'.-/0%'8L'2:% !"#$)*(01+2(#

•  ())&*+,-./%01.#1,22*/#%3/4!15,+!%6(037%
–  C2+*-M/(*%+'%/%8/-L(@=/-%N:*-O1(*P%
34%5''2% –  B<:+-/(+:%/G/>%M-'0%108=*0*2+/L'2%?*+/1=%
678$9912:+;**(:;<*-)*=*>;*?@9A**"##% –  &*+%'M%M@2(L'2:Q%?/+/%:+-@(+@-*:Q%/2?%('2:+/2+:;%%

•  &'()*+%B,C%
–  R*+G'-)%8-'.-/0012.%12+*-M/(*%

&'()*+%B,C% U&3%&'()*+%B,C%
•  &'()*+%B,C% •  V-'0%>'@-%@21O*-:1+>Q%IT%U*-)*=*>%J"WXY:K%
–  R*+G'-)%8-'.-/0012.%12+*-M/(*% •  5':+%8'8@=/-%2*+G'-)%B,C%

B88=1(/L'2% •  ,'-+*?%+'%O/-1'@:%Z&*:Q%O/-1'@:%=/2.@/.*:%
–  F12?'G:%F12:'()Q%U&3Q%Z&%[Q%\12@HQ%&'=/-1:Q%]%
&'()*+% –  &'()*+%0'?@=*:%12%^/O/Q%,>+6'2Q%,*-=Q%]%

S-/2:8'-+%
B,C% •  &101=/-%+'%I21H%_=*%C9Z%B,C%
ST,% I3,% –  C2%+6*%M'-0%'M%8&!%9!'+1*)4.1%J:'-+%'M%6/2?=*K;%
–  T/2%:6/-*%+6*%:/0*%read()9write()9close()%:>:+*0%(/==:;%
R*+G'-)%% C,%

Z@+=12*% &'()*+:%
•  &'()*+%B,C%0'LO/L'2Q%</().-'@2?% •  c/-1'@:%:'()*+:]%%B2>%:101=/-1+>D%

•  S>8*:%'M%:'()*+:%JST,%O:;%I3,K%
•  !=*0*2+/->%B,C%M@2(L'2:%
•  C9Z%0@=L8=*H12.%
•  !2?8'12+%'M%/%('22*(L'2%
•  ,-'`*(+%"%a%L2>%F'-=?%'M%F/-(-/b% –  C?*2L_*?%<>%C,%/??-*::%/2?%,'-+%2@0<*-%
•  B88*2?1H%J2'+%('O*-*?%12%+6*%=*(+@-*K%
•  ,-101LO*%+'%108=*0*2+%61.6d=*O*=%2*+G'-)12.%12+*-M/(*:%
–  *;.;Q%e*0'+*%8-'(*?@-*%(/==%Je,TK%%
S>8*:%'M%&'()*+:% S>8*:%'M%&'()*+:%J('2+k?K%%
3*0(+%#4-25(*#6+5+#789: ### ;+*+<0+%#4-25(*#6+5+#=;9:#
•  F6*2%:*2?12.%Nh1lP%/2?%Nh'8*%>'@k-*%G*==P%
•  T'22*(L'2d'-1*2+*?% •  T'22*(L'2d=*::% •  ST,%+-*/+:%+6*0%/:%/%:12.=*%<>+*:%:+-*/0%
–  e*f@1-*:%('22*(L'2%
*:+/<=1:60*2+%g%+*-012/L'2%
•  e*=1/<=*%?*=1O*->% •  NU*:+d*i'-+P%?*=1O*->% U>+*:%:+-*/0%
–  C2d'-?*-%?*=1O*->%% –  ,'::1<=*%'@+d'Md'-?*-%?*=1O*->%
–  R'%-*+-/2:01::1'2%
–  e*+-/2:01::1'2%
–  R'%?@8=1(/+*:% –  ,'::1<=*%?@8=1(/+*:% =% =% *% G% ]% *% 8% '% h% l% 1% h%
•  h1.6%O/-1/2(*%12%=/+*2(>% •  \'G%O/-1/2(*%12%=/+*2(>%
–  T':+%'M%+6*%-*=1/<=*%:*-O1(*% •  I3,%+-*/+:%+6*0%/:%:*8/-/+*%0*::/.*:%
•  V1=*d=1)*%12+*-M/(*%J:+-*/012.K% •  ,/()*+d=1)*%12+*-M/(*%
–  e*f@1-*:%8/()*Lj12.%
•  !;.;Q%hSS,Q%&&hQ%VS,Q%]% •  !;.;Q%3R&Q%c'C,Q%cZ3Q%BZ3Q%]%% h'8*%>'@k-*%
h1l%
G*==%
X%

S>8*:%'M%&'()*+:%J('2+k?K%% Z@+=12*%
•  S6@:Q%ST,%2**?:%/88=1(/L'2d=*O*=%0*::/.*% •  &'()*+%B,C%0'LO/L'2Q%</().-'@2?%
<'@2?/->;%
•  S>8*:%'M%:'()*+:%JST,%O:;%I3,K%
–  U>%(/-->12.%=*2.+6%12%/88=1(/L'2d=*O*=%6*/?*-%
–  !;.;% :+-@(+%0>o/88o6?-%p% •  !=*0*2+/->%B,C%M@2(L'2:%
%12+%=*2.+6% •  C9Z%0@=L8=*H12.%
q%
•  ,-'`*(+%"%a%L2>%F'-=?%'M%F/-(-/b%
U>+*:%:+-*/0%

=% =% *% G% ]% '% h% "n% l% 1% h% m%
W%

&(*2/-1'%r"%a%ST,%(=1*2+d:*-O*-% C21L/=1j/L'2$%:*-O*-%s%(=1*2+Q%socket()%
•  &*f@*2(*%'M%/(L'2:% int sock = socket(AF_INET, SOCK_STREAM, 0);!
if (sock < 0) {!
8'/()*# 3(0>(0# !perror(“socket() failed”);!
!abort();!
socket()
S*-012/L'2% 3/+/%+-/2:M*-% T'22*(L'2% C21L/=1j/L'2%

socket() }!
bind()
listen() •  socket(): 0(*?0)4#+#4-25(*#.(420/&*-0#
!:+/<=1:60*2+%

connect() accept() •  AF_INET: $9>@#+..0(44#1+%/'AB#6/=:'%Z4%G1+6%,VoCR!SK !


–  T;M;%C,On%tu%BVoCR!Sn%
send() or write() recv() or read()
•  SOCK_STREAMC#4*0(+%/)<#4-25(*#*A&(!
]% ]% –  T;M;%&ZT4o3veB5%%
recv() or read() send() or write()
•  perror()$%8-12+:%'@+%/2%*--'-%0*::/.*%
S10*%

close() close()
""%
!--'-%('?*%12%I21H%8-'.-/0012.% C21L/=1j/L'2$%:*-O*-Q%bind()%
extern int errno; !// by #include <errno.h>! •  &*-O*-%2**?:%+'%<12?%/%8/-L(@=/-%8'-+%2@0<*-;%
struct sockaddr_in sin;!
•  5/2>%I21H%:>:+*0%(/==:%/2?%=1<-/->%M@2(L'2:%:*+%errno%'2%*--'-:% memset(&sin, 0, sizeof(sin));!
sin.sin_family = AF_INET;!
sin.sin_addr.s_addr = INADDR_ANY;!
•  5/(-':%M'-%*--'-%('?*:%Jw!k%s%*--'-%2/0*K% sin.sin_port = htons(server_port);!
–  EINTR, EWOULDBLOCK, EINVAL, …!
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {!
–  “man 5:/+;/,2!P%:6'G:%8'::1<=*%*--'-%('?*%M'-%+6*%M@2(L'2%2/0*% !perror(“bind failed”);!
!abort();!
•  V@2(L'2:%+'%('2O*-+%*--'-%('?*%12+'%6@0/2%-*/?/<=*%0:.:% }!
–  void perror(const char *my_str)%% •  bind()$%<12?:%/%:'()*+%G1+6%/%8/-L(@=/-%8'-+%2@0<*-;%
•  B=G/>:%=''):%M'-%errno! –  4*-2*=%-*0*0<*-:%G61(6%8-'(*::%6/:%<'@2?%G61(6%8'-+J:K;%%
•  8-12+:%'@+%N0>%:+-$%*--'-%('?*%:+-12.P% –  Z2=>%'2*%8-'(*::%(/2%<12?%/%8/-L(@=/-%8'-+%2@0<*-%/+%/%L0*;%

•  4*0?2*#4-25+..0D/)$%C8Oy%:'()*+%/??-*::%:+-@(+@-*;%J(;M;Q%:+-@(+%:'()/??-o12nK%
–  const char *strerror(int err_code)%%
•  x'@%0@:+%8-'O1?*%/2%*--'-%('?*% •  $EF;;GDFEH$%CM%:*-O*-%6/:%0@=L8=*%C,%/??-*::*:Q%<12?:%/2>%/??-*::;%
•  -*+@-2:%/%:+-12.%M'-%+6*%err_code!
•  I*-)46:$%('2O*-+:%6':+%<>+*%'-?*-%12+'%2*+G'-)%<>+*%'-?*-;%%%

!2?1/2*::% !2?1/22*::%J('2+k?K%
•  EK%x'@%6/O*%/%"nd<1+%2@0<*-$%YHYBYU;%h'G%1:%1+%:+'-*?%12%0*0'->D% •  R*+G'-)%<>+*%'-?*-$%U1.%*2?1/2%
C2(-*/:12.%/??-*::% –  S'%/O'1?%+6*%*2?1/2%%8-'<=*0%
0x0B! •  F*%0@:+%@:*%2*+G'-)%<>+*%'-?*-%G6*2%:*2?12.%"n<1+Q%
0x0A! J/<#K)./+)#
m#<1+%Q%ny<1+%2@0<*-:;%%
0x0B! 0x0A! L/M'(#K)./+)# •  IL=1+>%M@2(L'2:%M'-%*/:>%('2O*-:1'2%

C2(-*/:12.%/??-*::% uint16_t htons(uint16_t host16bitvalue);!


uint32_t htonl(uint32_t host32bitvalue);!
•  h':+%<>+*%'-?*-%1:%2'+%@21M'-0% uint16_t ntohs(uint16_t net16bitvalue);!
–  &'0*%0/(612*:%/-*%U1.%*2?1/2Q%'+6*-:%/-*%\17=*%*2?1/2% uint32_t ntohl(uint32_t net32bitvalue);!

•  T'00@21(/L2.%<*+G**2%0/(612*:%G1+6%?1i*-*2+%6':+%<>+*%'-?*-:% •  h12+$%hQ%nQ%sQ%/2?%l%:+/2?%M'-%6':+%<>+*%'-?*-Q%2*+G'-)%<>+*%'-?*-Q%
1:%8-'<=*0/L(% :6'-+J"n<1+KQ%/2?%='2.Jm#<1+KQ%-*:8*(LO*=>%!
–  S-/2:M*--*?%z#{n%JYHY"YYKQ%<@+%-*(*1O*?%z"%JYHYYY"K%%

C21L/=1j/L'2$%:*-O*-Q%bind()% e*@:12.%+6*%:/0*%8'-+%
•  &*-O*-%2**?:%+'%<12?%/%8/-L(@=/-%8'-+%2@0<*-;% •  Bb*-%ST,%('22*(L'2%(=':*:Q%G/1+:%M'-%#5&\Q%G61(6%1:%+G1(*%0/H10@0%
:*.0*2+%=1M*L0*%JM-'0%"%+'%y%012:Q%108=*0*2+/L'2%?*8*2?*2+K;%F6>D%
struct sockaddr_in sin;! •  &*.0*2+%-*M*-:%+'%0/H10@0%:1j*%'M%8/()*+%
memset(&sin, 0, sizeof(sin));!
sin.sin_family = AF_INET;! •  ,'-+%2@0<*-%(/22'+%<*%-*@:*?%<*M'-*%#5&\%
sin.sin_addr.s_addr = INADDR_ANY;! •  U@+%:*-O*-%8'-+%2@0<*-:%/-*%_H*?%tu%5@:+%<*%-*@:*?%
sin.sin_port = htons(server_port);! •  &'=@L'2$%,@+%+61:%('?*%<*M'-*%bind() %
if (bind(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {!
!perror(“bind failed”);! int optval = 1;!
!abort();! if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
}! &optval, sizeof(optval)) < 0) {!
•  bind()$%<12?:%/%:'()*+%G1+6%/%8/-L(@=/-%8'-+%2@0<*-;%
!perror(“reuse failed”);!
–  4*-2*=%-*0*0<*-:%G61(6%8-'(*::%6/:%<'@2?%G61(6%8'-+J:K;%% !abort();!
–  Z2=>%'2*%8-'(*::%(/2%<12?%/%8/-L(@=/-%8'-+%2@0<*-%/+%/%L0*;%
}!
•  4*0?2*#4-25+..0D/)$%C8Oy%:'()*+%/??-*::%:+-@(+@-*;%J(;M;Q%:+-@(+%:'()/??-o12nK%

•  $EF;;GDFEH$%CM%:*-O*-%6/:%0@=L8=*%C,%/??-*::*:Q%<12?:%/2>%/??-*::;%
•  4(*4-25-&*6:$%(6/2.*:%:'()*+Q%8-'+'('=%%'8L'2:;%%
•  I*-)46:$%('2O*-+:%6':+%<>+*%'-?*-%12+'%2*+G'-)%<>+*%'-?*-;%%% –  *;.;Q%<@i*-%:1j*Q%L0*'@+%O/=@*Q%]%
C21L/=1j/L'2$%:*-O*-Q%listen()% C21L/=1j/L'2%&@00/->%%
•  &'()*+%1:%/(LO*Q%<>%?*M/@=+% •  T=1*2+%
•  F*%2**?%+'%0/)*%1+%8/::1O*%+'%.*+%('22*(L'2:;% –  socket()!

if (listen(sock, back_log) < 0) {! •  &*-O*-%


!perror(“listen failed”);! –  socket() !
!abort();! –  setsockopt(sock, SOL_SOCKET, SO_REUSEADDR)!
}! –  bind()!
–  listen()!
•  listen()$%('2O*-+:%/2%/(LO*%:'()*+%+'%8/::1O*%
•  ,1|/==:%
•  back_log$%('22*(L'2dG/1L2.%f@*@*%:1j*;%J*;.;Q%m#K% –  S6*%'-?*-%'M%+6*%M@2(L'2:%0/7*-%
–  U@:>%:*-O*-%0/>%2**?%/%=/-.*%O/=@*%J*;.;Q%"Y#yQ%]K%
–  3'%2'+%M'-.*+%+'%@:*%htons() +'%6/2?=*%8'-+%2@0<*-%

&(*2/-1'%r"%a%ST,%(=1*2+d:*-O*-% T'22*(L'2%!:+/<=1:60*2+%J(=1*2+K%
•  &*f@*2(*%'M%/(L'2:% struct sockaddr_in sin;!
memset(&sin, 0 ,sizeof(sin));!
8'/()*# 3(0>(0#
sin.sin_family != AF_INET;!
socket() sin.sin_addr.s_addr = inet_addr(“128.32.132.214”);!
S*-012/L'2% 3/+/%+-/2:M*-% T'22*(L'2% C21L/=1j/L'2%

socket()
sin.sin_port = htons(80);!
bind()
listen() if (connect(sock, (struct sockaddr *) &sin, sizeof(sin)) < 0) {!
!:+/<=1:60*2+%

!perror(“connection failed”);!
connect() accept() !abort();!
}!
send() or write() recv() or read()
]% ]% •  Connect()$%G/1+:%@2L=%('22*(L'2%*:+/<=1:6*:9M/1=:%
recv() or read() send() or write()
•  inet_addr()$%('2O*-+:%/2%C,%/??-*::%:+-12.%12+'%/%m#<1+%/??-*::%
S10*%

close() close() 2@0<*-%J2*+G'-)%<>+*%'-?*-K;%%


#"%

h':+%2/0*Q%C,%/??-*::Q%,'-+%2@0<*-% T'22*(L'2%!:+/<=1:60*2+%J:*-O*-K%
•  h':+%2/0*% struct sockaddr_in client_sin;!
int addr_len = sizeof(client_sin);!
–  h@0/2%-*/?/<=*%2/0*%J*;.;Q%GGG;**(:;<*-)*=*>;*?@K% int client_sock = accept(listening_sock, !
–  c/-1/<=*%=*2.+6% (struct sockaddr *) &client_sin,!
–  T'@=?%6/O*%0@=L8=*%C,%/??-*::*:% &addr_len);!
if (client_sock < 0) {!
!perror(“accept failed”);!
•  C,%O*-:1'2%y%/??-*::% !abort();!
–  I:@/==>%-*8-*:*2+*?%/:%?'7*?%2@0<*-:%M'-%6@0/2%-*/?/<1=1+>% }!
•  !;.;Q%"#X;m#;"m#;#"y%
–  m#%<1+:%12%2*+G'-)%<>+*%'-?*-%
•  !;.;Q%";#;m;y%tu%YHYyYmY#Y"% •  accept()$%-*+@-2:%/%2*G%:'()*+%?*:(-18+'-%M'-%/%(=1*2+%('22*(L'2%12%+6*%
('22*(L'2dG/1L2.%f@*@*;%
•  ,'-+%2@0<*-% –  S61:%:'()*+%?*:(-18+'-%1:%+'%('00@21(/+*%G1+6%+6*%(=1*2+%
–  C?*2L_*:%/%:*-O1(*%J'-%/88=1(/L'2K%'2%/%6':+% –  S6*%8/::1O*%:'()*+%J=1:+*212.o:'()K%1:%2'+%+'%('00@21(/+*%G1+6%/%(=1*2+%
•  !;.;Q%ST,%,'-+%XY%tu%G*<%:*-O1(*Q%I3,%,'-+%{m%tu%2/0*%:*-O1(*%J3R&K%
–  "n%<1+%@2:1.2*?%2@0<*-%JYAn{{m{K% •  client_sin$%('2+/12:%(=1*2+%C,%/??-*::%/2?%8'-+%2@0<*-%
–  EK%B-*%+6*>%12%U1.%*2?1/2%'-%\17*2%*2?1/2D%
&(*2/-1'%r"%a%ST,%(=1*2+d:*-O*-% &*2?12.%3/+/$%:*-O*-s(=1*2+Q%send()!
•  &*f@*2(*%'M%/(L'2:% char *data_addr = “hello, world”;!
int data_len = 12;!
8'/()*# 3(0>(0#
int sent_bytes = send(sock, data_addr, data_len, 0); !
socket() if (sent_bytes < 0) {!

S*-012/L'2% 3/+/%+-/2:M*-% T'22*(L'2% C21L/=1j/L'2%


socket()
!perror(“send failed”);!
bind()
}!
listen()

!:+/<=1:60*2+%
•  send()$%:*2?:%?/+/Q%-*+@-2:%+6*%2@0<*-%'M%:*2+%<>+*:%
connect() accept() –  B=:'%Z4%G1+6%write()Q%writev()%
•  data_addr$%/??-*::%'M%?/+/%+'%:*2?%
send() or write() recv() or read() •  data_len$%:1j*%'M%+6*%?/+/%
]% ]%
•  F1+6%<='()12.%:'()*+:%J?*M/@=+KQ%:*2?JK%<='():%@2L=%1+%:*2?:%/==%+6*%?/+/;%
recv() or read() send() or write()
•  F1+6%2'2d<='()12.%:'()*+:Q#4()*DNA*(4#0/>%2'+%*f@/=%+'%.+*+D'()#
–  CM%)*-2*=%?'*:%2'+%6/O*%*2'@.6%:8/(*Q%1+%/((*8+:%'2=>%8/-L/=%?/+/%
S10*%

close() close()
–  x'@%0@:+%-*+->%M'-%+6*%@2:*2+%?/+/%
#{%

e*(*1O12.%3/+/$%:*-O*-s(=1*2+Q%recv()! S*-012/L'2$%:*-O*-s(=1*2+Q%(=':*JK%
char buffer[4096];!
int expected_data_len = sizeof(buffer);! // after use the socket!
int read_bytes = recv(sock, buffer, expected_data_len, 0);! close(sock);!
if (read_bytes == 0) { !// connection is closed!
! …!
} else if (read_bytes < 0) { // error!
!perror(“recv failed”);!
} else { !// OK. But no guarantee read_bytes == expected_data_len!
!…!
}! •  close()$%(=':*:%+6*%:'()*+%?*:(-18+'-%
•  recv()$%-*/?:%<>+*:%M-'0%+6*%:'()*+%/2?%-*+@-2:%+6*%2@0<*-%'M%-*/?%<>+*:;%
–  B=:'%Z4%G1+6%read()%/2?%readv()!
•  F*%(/22'+%'8*2%_=*:9:'()*+:%0'-*%+6/2%"Y#y~%
•  read_bytes 0/>%2'+%*f@/=%+'%(O&(2*(.D.+*+D'()# –  F*%0@:+%-*=*/:*%+6*%-*:'@-(*%/b*-%@:*%
–  CM%2'%?/+/%1:%/O/1=/<=*Q%1+%<='():%
–  CM%'2=>%8/-L/=%?/+/%1:%/O/1=/<=*Q%-*/?o<>+*:%}%*H8*(+*?o?/+/o=*2%
–  Z2%:'()*+%(=':*Q%*H8*(+*?o?/+/o=*2%*f@/=:%+'%Y%J2'+%*--'-lK%
–  CM%>'@%.*+%'2=>%8/-L/=%?/+/Q%>'@%:6'@=?%-*+->%M'-%+6*%-*0/1212.%8'-L'2;%
~%&@8*-%@:*-%(/2%'O*-('0*%+61:%('2:+-/12+Q%<@+%-*.@=/-%@:*-%(/22'+;%

&(*2/-1'%r#%a%I3,%(=1*2+d:*-O*-% &(*2/-1'%r#%a%I3,%(=1*2+d:*-O*-%
•  EK%F6/+%0@:+%<*%(6/2.*?D% •  BK%F*%2**?%/%?1i*-*2+%121L/=1j/L'2%
8'/()*# 3(0>(0# 8'/()*# 3(0>(0#
socket() socket()
S*-012/L'2% 3/+/%+-/2:M*-% T'22*(L'2% C21L/=1j/L'2%

S*-012/L'2% 3/+/%+-/2:M*-% T'22*(L'2% C21L/=1j/L'2%

socket() socket()
bind() bind()
listen() listen()
!:+/<=1:60*2+%

!:+/<=1:60*2+%

connect() accept() connect() accept()

send() or write() recv() or read() send() or write() recv() or read()


]% ]% ]% ]%
recv() or read() send() or write() recv() or read() send() or write()
S10*%

S10*%

close() close() close() close()


#W% mY%
C21L/=1j/L'2$%I3,% &(*2/-1'%r#%a%I3,%(=1*2+d:*-O*-%
int sock = socket(AF_INET, SOCK_DGRAM, 0);! •  EK%F6/+%*=:*%0@:+%<*%(6/2.*?D%
if (sock < 0) {! 8'/()*# 3(0>(0#
!perror(“socket failed”);!
socket()

S*-012/L'2% 3/+/%+-/2:M*-% T'22*(L'2% C21L/=1j/L'2%


socket()
!abort();! bind()
}! listen()

!:+/<=1:60*2+%
connect() accept()

•  I3,%@:*:%&ZT4o3veB5%12:+*/?%'M% send() or write() recv() or read()


&ZT4o&Se!B5% ]% ]%
recv() or read() send() or write()

S10*%
close() close()
m#%

&(*2/-1'%r#%a%I3,%(=1*2+d:*-O*-% &(*2/-1'%r#%a%I3,%(=1*2+d:*-O*-%
•  BK%I3,%1:%2-))(2,-)P'(44;%F*%-*0'O*%/==%('22*(L'2% •  BK%listen()%1:%/=:'%-*=/+*?%+'%('22*(L'2;%e*0'O*%1+;%
-*=/+*?%:+*8:;%
8'/()*# 3(0>(0# 8'/()*# 3(0>(0#
socket() socket()
C21L/=1j/L'2%

C21L/=1j/L'2%
socket() socket()
bind() bind()
listen()

send() or write() recv() or read() send() or write() recv() or read()


S*-012/L'2% 3/+/%+-/2:M*-%

S*-012/L'2% 3/+/%+-/2:M*-%
]% ]% ]% ]%
recv() or read() send() or write() recv() or read() send() or write()
S10*%

S10*%

close() close() close() close()


mm% my%

&(*2/-1'%r#%a%I3,%(=1*2+d:*-O*-% &(*2/-1'%r#%a%I3,%(=1*2+d:*-O*-%
•  EK%R'G%1+k:%@2(=*/-%G6*-*%+'%:*2?%8/()*+:%/2?%M-'0%G6*-*% •  BK%v1O*%}/??-*::Q8'-+u%12M'-0/L'2%G6*2%:*2?12.%/%8/()*+;%S6/+%1:Q%
C%-*(*1O*l%T/2%G*%:'=O*%+61:D % @:*%sendto()%/2?%recvfrom()%12:+*/?%'M%send()%/2?%recv() !

8'/()*# 3(0>(0# 8'/()*# 3(0>(0#


socket() socket()
C21L/=1j/L'2%

C21L/=1j/L'2%

socket() socket()
bind() bind()

send() or write() recv() or read() sendto()


S*-012/L'2% 3/+/%+-/2:M*-%

S*-012/L'2% 3/+/%+-/2:M*-%

recvfrom()
]% ]% ]% ]%
recv() or read() send() or write() recvfrom() sendto()
S10*%

S10*%

close() close() close() close()


m{% mn%
&*2?%3/+/%ZO*-%I3,$%sendto()! e*(*1O*%3/+/%ZO*-%I3,$%recvfrom()%%%
struct sockaddr_in sin;! struct sockaddr_in sin;!
memset(&sin, 0, sizeof(sin));! int sin_len;!
char buffer[4096];!
sin.sin_family = AF_INET;!
sin.sin_addr.s_addr = inet_addr(“128.32.132.214”);! int read_bytes = recvfrom(sock, buffer, sizeof(buffer), 0,
sin.sin_port = htons(1234);! ! ! ! ! ! ! !(struct sockaddr *) &sin, &sin_len);!

sent_bytes = sendto(sock, data, data_len, 0, ! if (read_bytes < 0) {!


!! ! ! (struct sockaddr *) &sin, sizeof(sin));! !perror(“recvfrom failed”);!
if (sent_bytes < 0) {! !abort();!
!perror(“sendto failed”);! }!
!abort();!
}!
•  recvfrom()$%-*/?:%<>+*:%M-'0%+6*%:'()*+%/2?%:*+:%+6*%:'@-(*%12M'-0/L'2%
•  sendto()$%:*2?:%/%8/()*+%+'%/%:8*(1_(%?*:L2/L'2%/??-*::%/2?%8'-+%
–  (;M;Q%12%ST,Q%G*%?'%+61:%?*:L2/L'2%:*2.%G6*2%(/==12.%connect()! •  e*/?12.%Y%<>+*:%?'*:%2'+%0*/2%N('22*(L'2%(=':*?P%@2=1)*%ST,;%%
•  B:%'88':*?%+'%ST,Q%I3,%8/()*Lj*:%?/+/;%&'Q%sendto()%:*2?:%/==%?/+/%'-% –  e*(/==%I3,%?'*:%2'+%6/O*%/%2'L'2%'M%N('22*(L'2P;%
2'+612.;%

B,C%M@2(L'2:%&@00/->% Z@+=12*%
789# =;9# •  &'()*+%B,C%0'LO/L'2Q%</().-'@2?%
•  C21L/=1j/L'2% •  C21L/=1j/L'2%
–  :'()*+JBVoCR!SQ%&ZT4o&Se!B5Q%YK% –  :'()*+JBVoCR!SQ%&ZT4o3veB5Q%YK% •  S>8*:%'M%:'()*+:%JST,%O:;%I3,K%
–  :*+:'()'8+J:'()Q%&Z\o&ZT4!SQ% –  :*+:'()'8+J:'()Q%&Z\o&ZT4!SQ%
&Zoe!I&!B33eQ%]K%
–  <12?JK%
&Zoe!I&!B33eQ%]K%
–  <12?JK%
•  !=*0*2+/->%B,C%M@2(L'2:%
–  =1:+*2JK%
•  T'22*(1+'2% •  R'%('22*(L'2%
•  C9Z%0@=L8=*H12.%
–  ('22*(+JK%
–  /((*8+JK% •  ,-'`*(+%"%a%L2>%F'-=?%'M%F/-(-/b%
•  3/+/%+-/2:M*-% •  3/+/%+-/2:M*-%
–  :*2?JK% –  :*2?+'JK%
–  -*(OJK% –  -*(OM-'0JK%
•  S*-012/L'2% •  S*-012/L'2%
–  (=':*JK% –  (=':*JK%

h'G%+'%6/2?=*%0@=L8=*%128@+:D% ,'==12.%@:12.%2'2d<='()12.%:'()*+%
•  3/+/%:'@-(*:%
•  S61:%/88-'/(6%G/:+*:%T,I%(>(=*:%
–  &+/2?/-?%128@+%J*;.;Q%)*><'/-?K% int opt = fcntl(sock, F_GETFL);! Q(*4#*I(#4-25(*R4#
–  5@=L8=*%:'()*+:% if (opt < 0) {!
!perror(“fcntl failed”);!
-&,-)#
•  ,-'<=*0$%/:>2(6-'2'@:%?/+/%/--1O/=% }!
!abort();!

–  ,-'.-/0%?'*:%2'+%)2'G%G6*2%1+%G1==%/--1O*;% if (fcntl(sock, F_SETFL, opt | O_NONBLOCK) < 0) {! =&.+*(4#*I(#4-25(*R4#


•  CM%2'%?/+/%/O/1=/<=*Q%recv()%<='():;% !perror(“fcntl failed”);! -&,-)#S/*I#)-)#
!abort();!
•  CM%<='()*?%'2%'2*%:'@-(*Q%(/22'+%6/2?=*%'+6*-%:'@-(*:% }!
N'-25/)<#-&,-)##
–  &@88':*%G6/+%1M%/%G*<%:*-O*-%(/22'+%6/2?=*%0@=L8=*%('22*(L'2:% while (1) {!
!int read_bytes = recv(sock, buffer, sizeof(buffer), 0);!
•  &'=@L'2:% !if (read_bytes < 0) {!
! !if (errno == EWOULDBLOCK) {! TI()#)-#.+*+U#
–  ,'==12.%@:12.%2'2d<='()12.%:'()*+%!%C2*Ä(1*2+% ! ! !// OK. Simply no data!
–  C9Z%0@=L8=*H12.%@:12.%:*=*(+JK%!%:108=*% ! !} else {! S(#4((#KTV=L;JLV8W#
–  5@=L+6-*/?12.%!%0'-*%('08=*H;%R'+%('O*-*?%+'?/>% ! ! !perror(“recv failed”);! (00-0#2-.(B##
! ! !abort();!
! !}!
} !
C9Z%0@=L8=*H12.%@:12.%select()! U1<=*:%a%<'+6%<>%F;%e1(6/-?%&+*O*2:%
fd_set read_set;!
struct timeval timeout!

FD_ZERO(&read_set); ! $)/,+'/X(4#+0<?%()*4#1-0#
FD_SET(sock1, &read_set);!
FD_SET(sock2, &read_set);!
4('(2*6:#
timeout.tv_sec = 0;!
timeout.tv_usec = 5000;!

if (select(MAX(sock1, sock2) + 1, &read_set, NULL,!


!! ! ! !NULL, &time_out) < 0) {!
!perror(“select failed”);!
!abort();!
}! ,/::%RI\\%12:+*/?%'M%
gL0*'@+%1M%>'@%G/2+%
if (FD_ISSET(sock1, &read_set)) {! +'%G/1+%12?*_21+*=>%%
!// sock1 has data!
}!
if (FD_ISSET(sock2, &read_set)) {! 8I(254#$YV#(>()*4B#
!// sock2 has data!
}!

,-'`*(+%"%a%-/<%F'-=?%'M%F/-(-/b%% ,-'`*(+%"%a%-/<%F'-=?%'M%F/-(-/b%%
•  v/0*%(=1*2+%M'-0:%ST,%('22*(L'2%
G1+6%+6*%./0*%:*-O*-% •  31O1?*?%12+'%#%8/-+:$%
•  C+%:6'@=?%:@88'-+%+6*:*%('00/2?:% –  ,/-+%"$%?*O*='8%/%./0*%(=1*2+%
–  \'.12$%='/?:%8=/>*-%8-'_=*%M-'0%/%
_=*% •  5*::/.*%M'-0/+:%/2?%('00/2?:%G1==%<*%.1O*2%%
–  \'.'@+$%:/O*:%8=/>*-%8-'_=*%12+'%/% •  T/2%+*:+%>'@-%(=1*2+%'2%8-'O1?*?%-*M*-*2(*%:*-O*-%
_=*Q%(=':*:%+6*%('22*(L'2%
–  5'O*$%@8?/+*:%+6*%8=/>*-k:%='(/L'2%
12%+6*%./0*%
–  ,/-+%#$%?*O*='8%/%./0*%:*-O*-%
–  &8*/)$%:*2?:%/%(6/+%0*::/.*%+'%/==% •  C+%:6'@=?%G'-)%G1+6%>'@-%(=1*2+%
–  B7/()$%/7/():%/%8=/>*-%12%:1.6+%

B88*2?1H%a%,-'.-/0012.%S18:% S18%r"%
•  F1==%2'+%<*%('O*-*?%?@-12.%+6*%=*(+@-*% •  h'G%+'%(6*()%+6*%6':+%<>+*%'-?*-%'M%0>%
•  ,=*/:*%-*M*-%+'%+6*:*%L8:%1M%>'@k-*%12+*-*:+*?% 0/(612*D%

union {!
!uint16_t number;!
!uint8_t bytes[2];!
} test;!
test.number = 0x0A0B;!
printf(“%02x%02x\n”, test.bytes[0],
! ! ! ! ! ! ! ! test.bytes[1]);!
S18%r#% S18%rm%
•  h'G%+'%.*+%C,%/??-*::%M-'0%6':+%2/0*% •  U>%?*M/@=+Q%I21H%+*-012/+*:%+6*%8-'(*::%G1+6%
–  I:*%gethostbyname()! 3$Q9$9K#1M%>'@%G-1+*%+'%/%ST,%:'()*+%G61(6%6/:%
<**2%(=':*?%<>%+6*%'+6*-%:1?*;%x'@%(/2%?1:/<=*%
struct sockaddr_in sin;! 1+%<>$%
struct hostent *host;!
host = gethostbyname(“www.berkeley.edu”);! signal(SIGPIPE, SIG_IGN);!
sin.sin_addr.s_addr !
!= *(unsigned *) host->h_addr_list[0];!

S18%ry%d%&+-@(+@-*%,/()12.% S18%ry%d%&+-@(+@-*%,/()12.%J('2+k?K%
•  F*%6/O*%+6*%M'=='G12.%/88=1(/L'2d=*O*=%8/()*+% •  T'081=*-%G1==%+->%+'%<*%yd<>+*%/=1.2*?%J'2%m#<1+%0/(612*:K%
•  S'%/O'1?%+6*%8-*O1'@:%(/:*Q%G*%0@:+%8/()%:+-@(+%
6*/?*-%M'-0/+%J+6*%2@0<*-:%?*2'+*%_*=?%:1j*%
12%<>+*:K% length type source dest T/).-S4#&0-<0+%%/)<#4*A'(# Q88#4*A'(#
addr addr r8-/.0/%8/()J8@:6Q%"K%
:+-@(+%0>o8)+o6?-%p%
2 1 4 4 :+-@(+%0>o8)+o6?-%p%
%@2:1.2*?%:6'-+%=*2.+6Å% %@2:1.2*?%:6'-+%=*2.+6Å%
•  &'Q%G*%?*_2*%+6*%6*/?*-%/:%:+-@(+%=1)*%+61:$% %@2:1.2*?%(6/-%+>8*Å%
%@2:1.2*?%(6/-%+>8*Å%
%@2:1.2*?%12+%:'@-(*o/??-Å%
%@2:1.2*?%12+%:'@-(*o/??-Å%
struct my_pkt_hdr {! %@2:1.2*?%12+%?*:+o/??-Å%
%@2:1.2*?%12+%?*:+o/??-Å% Ze%
!unsigned short length;! q%oo/7-1<@+*ooJJ8/()*?KKÅ%
qÅ%
!unsigned char type;! r8-/.0/%8/()J8'8K%
!unsigned int source_addr;!
!unsigned int dest_addr;!
};!
•  EK%e*:@=+%'M%:1j*'MJ:+-@(+%0>o8)+o6?-KD%%

I:12.%man%8/.*:%
•  U*:+%:'@-(*%+'%:+@?>%:>:+*0%(/==:%/2?%=1<-/->%
M@2(L'2:%
–  S*==:%G61(6%6*/?*-%_=*:%:6'@=?%<*%12(=@?*?%
–  3*:(-1<*:%6'G%*/(6%M@2(L'2%G'-):%
–  S*==:%G6/+%+6*%-*+@-2%O/=@*%0*/2:%/2?%G6/+%*--'-%
2@0<*-%(/2%6/88*2%
–  !;.;Q%%man connect%%

S-ar putea să vă placă și