发新话题
打印

急:请教一个client/server的UDP通信问题,高手请进-->多谢!

从网上下了这两个程序,我进行了适当的修改了,在red hat linux7.1下编译通过。
; u1 r$ C& Y8 ?8 \% Z源程序如下:- X& E( a; v" |% B& \
/*client_udp.c*/
$ r: U: _# _. j9 {3 n% r$ E#include <stdio.h>( m! @0 K- s5 O% ^
#include <errno.h>; d2 L& R# C- R( |1 Z! Z! |6 n
#include <sys/types.h>* m  p/ Q: |: N& o; C
#include <sys/socket.h>. Q) B- a% ^6 Q) j+ _/ i" W* h9 e& g* [
#include <stdlib.h>/ X. G# ?2 Z* O4 L5 U( V
#include <time.h>2 y  |* R7 T1 G9 L' F8 u2 G0 e
#include <netinet/in.h>1 j# x6 g8 V3 c/ T; f+ X6 N

0 J$ O! N1 K: y& Y. i+ f  N#define MAX_BUF_SIZE 1024 % z: f3 x* y# i+ E9 P- f7 M
void udpc_requ(int sockfd,const struct sockaddr *addr,int len)& d5 {$ ^0 ^9 x3 F. l2 x  h, n' k$ l
{
) m( Z! O+ y1 g# T  char buffer[MAX_BUF_SIZE]; 4 H! B5 q: v) C  `+ w
  int n;
# T1 m/ w9 I$ h) K# q/ @  while(1)
8 W: l3 }! g: Z8 m- O' `; k7 w2 @  {
/ g! s" K. _, f; G; f& ]   fgets(buffer,MAX_BUF_SIZE,stdin);
+ I: p7 B3 v9 T) O; \' @   sendto(sockfd,buffer,strlen(buffer),0,addr,len);
6 f, D) T: H2 O  z# k' t" j1 q. W   bzero(buffer,MAX_BUF_SIZE);  
; ]% W* w% Q0 R3 W3 l   n=recvfrom(sockfd,buffer,MAX_BUF_SIZE,0,NULL,NULL);
. H2 |4 q' ]$ ?# P4 e2 B/ u7 _   buffer[n]=0;
( M4 N/ s7 x8 _# p   fputs(buffer,stdout);
/ {( s, h/ [7 w& w" k! P} ! M+ F4 p2 ]( L* W5 Y
}
/ J9 n( B2 ?! y% x' V; B! {; ]/ A" u" L
int main(int argc,char **argv)
  b3 u- j7 b7 I$ |: M8 B{
- t8 F3 h# h- _  int sockfd,port;
3 C. Y. A2 G2 E) D3 X  [  struct sockaddr_in addr;
, ^0 }- l6 Y* ?  x/*  if(argc!=3) 2 @' B/ L" F8 v: J# q+ E$ }
   { 7 y+ i+ G" g& t3 p: g
    printf("\nPlease input Server IP and Server port\n");. Z0 E7 K0 s. o3 h' v+ {
    exit(1);
& i6 q* D0 c! }, H; x2 g* r   } */7 ]" a7 s2 u' \. c
  if((port=atoi(argv[2]))<0), K  D3 }* i1 j
  {
( d1 i4 _0 x, b2 {6 `    printf("\npara error,Please input Server IP and Server port\n");, O+ U& p- u; K8 _1 v. ^
    exit(1);
/ ]3 N$ r3 a) i( G$ X0 l  }
- e. ?# y5 G; n$ t1 |+ G  sockfd=socket(AF_INET,SOCK_DGRAM,0);! M4 N3 `9 c* [  c' g6 k: A
  if(sockfd<0)3 ^4 ]8 V. |" }" b; G) i
  {
5 O5 b# p- F( g; `: v    printf("Socket Error:");
' Y; q  F, w% G    exit(1); 5 b. e4 c( k3 W4 H' I
  }
  R1 N8 R- a# Z9 ?" v$ [9 D8 b+ b; r' n2 W7 E
  bzero(&addr,sizeof(struct sockaddr_in));- O# \( j: ]8 L, q# B
  addr.sin_family=AF_INET;1 s8 v1 h% e; [
  addr.sin_port=htons(port); / ]! E7 h4 m" Z9 t9 C& k# t
  if(inet_aton(argv[1],&addr.sin_addr)<0)
! I! o9 L0 Z* i* S* p   {
4 T* C0 y- T! H- {' [" |+ s    printf("Ip error:");
/ v+ P# X% t6 D- S, O: S    exit(1); 5 P# b) I$ N( L0 y5 ]3 ~5 s! P5 e- ]
   }
# ^' t/ r6 E% t+ Q# f% Y* O" I   udpc_requ(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));7 a' C. U7 G/ y3 q1 Z+ ^6 }
   close(sockfd);
0 |0 Z! E* G( M} $ g+ l/ T6 l9 V  Z

0 j- U: k& F; D! u: L$ ^
7 q/ P) [8 s% S; f7 p% e! A/*server_udp.c*/
. j# Y! N2 C" |, c#include <stdio.h>0 @4 ~3 L0 m3 w' O7 X
#include <sys/types.h>+ E5 l8 r& ?' J: o
#include <sys/socket.h>0 O4 H+ b9 l3 C. _1 S
#include <errno.h>8 P3 W% @+ E3 h
#include <stdlib.h>
& Q7 V/ H! Q, ]2 \! X7 _#include <time.h>
! x/ ^$ s8 G$ q#include <netinet/in.h>    /* define address struct sockaddr_in */
  r9 m3 O2 r1 y" j5 G  ]#define SERVER_PORT 8888 " I6 _+ l' ~$ ~  r2 ^! _
#define SERVER_ADDR "202.112.0.12"6 o" W* G7 G2 ]0 c$ ^
#define MAX_MSG_SIZE 1024 - X7 `  r/ ]6 L+ G

/ B' S' P8 f4 Z: zvoid udps_respon(int sockfd)( ~# A8 O6 W& F' C- H
{ 6 ]8 r6 A: }5 q) U+ T. v, m
  struct sockaddr_in serv_addr;3 A! r. G3 E) j$ C! c  [
  int addrlen,n;
8 a+ A7 X6 s: W$ Y6 n; V# J  char msg[MAX_MSG_SIZE];
! Q0 R- w! }* H: _. ^, {  while(1)
" N1 T: t/ `1 V% x; p  { $ L' a" {- B- F; v
   n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0, (struct sockaddr*)&serv_addr,&addrlen);& p5 q8 e2 r) j- p  A, J
   msg[n]=0;
1 }1 x* }4 b( B0 a* l% _   fprintf(stdout,"I have received %s",msg);" \! ?0 e6 J+ {  ^4 q( v" K
   sendto(sockfd,msg,n,0,(struct sockaddr*)&serv_addr,addrlen);; k6 M0 T, S' ]  |8 T; ]2 n  g) Q8 U) h
  } 7 m3 N9 F& |0 J* _0 _
} # ?# i/ N1 o& G4 j+ h. I

( v% H% a% D5 A; H9 wint main(void)
) X2 W% w# Y3 S, l{
( f/ z0 m1 l# P+ I* B% X* v  int sockfd;
+ U3 P% E9 u/ Z. s' {. Z, A  int ret;: K5 Q+ X2 U: B' R& t
  struct sockaddr_in addr; ! C4 U* I: W3 Y  \& a! [( H9 X( b3 T  y
  sockfd=socket(AF_INET,SOCK_DGRAM,0); 4 `/ D9 d% m+ Y4 i
  if(sockfd<0)
3 _: z7 b' v$ |$ X5 b  { : q3 ^; @' U" z/ e" m
   printf("Socket Error");
# b) G0 x; h: N& `, y( k' q4 z. Y   exit(1);
: h8 t7 G5 s! r7 Q5 h6 A- C- q  } 7 G% c5 q9 a/ i/ _6 O
  bzero(&addr,sizeof(struct sockaddr_in)); & [. B- w; B8 W+ @+ Z
  addr.sin_family=AF_INET; ) [  Z- j1 I" t7 n  G$ X
  addr.sin_addr.s_addr=htonl(inet_addr(SERVER_ADDR)); ( z; D, \' h" a* Y
  addr.sin_port=htons(SERVER_PORT);# Z& J; l: t: ^1 h! K0 M
  ret=bind(sockfd,(struct sockaddr *)&addr,sizeof(addr));+ [$ ]  Q: K2 t! Q2 e
  if(ret<0)
% Z, g' A# _! L5 ?# X  { 4 ?7 L$ i/ B& ?' }1 g: U0 ^
   printf("Bind Server Port Error"); " l9 C% V+ \; E0 @% p3 j1 N1 z
   exit(1); 2 d5 u9 _4 P2 f0 O4 }  \2 ]2 u
  }
! k3 |" h% _+ s* G( H/ V' m  udps_respon(sockfd);1 k6 g7 q: F) L4 J& a& o' e
  close(sockfd); - x- |& r# {5 [6 k
}* ~; \( r: w0 `$ B: O% k  t' Y2 X. J
  b4 @2 `6 a8 X6 D$ H
现在的问题是我不知道该怎么测试这两个程序,我用2 K2 \  b) t* ^5 ?6 u2 r
./client_udp my-server-IP my-server-port  asdfasdfa测试client端,但是后面无论输入多少字符都不退出.在一台机器上可以测试这两个程序吗,多谢啦!+ m5 Q1 U, ^* F% l. Z' G5 ]

& O, D0 q% L, R$ d6 k0 h( {      

TOP

发新话题