发新话题
打印

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

从网上下了这两个程序,我进行了适当的修改了,在red hat linux7.1下编译通过。& t3 r- V0 Q. H2 X
源程序如下:, l" q& y) q' [1 \
/*client_udp.c*/, s- a: o# S) f4 y. c, L2 Z- ?' a8 S
#include <stdio.h>
# W: G$ M/ E/ E. N8 X7 F/ x#include <errno.h>
8 p/ q5 {4 e, F0 J& \4 C- s" W" ?#include <sys/types.h>
. C) o4 k7 f6 Z- n( p#include <sys/socket.h>) T0 V( R! r& t6 u- @7 h% P
#include <stdlib.h>9 k" |8 K8 I: Z
#include <time.h>/ t- u' I5 Q0 U( B" \
#include <netinet/in.h>
0 y6 c- `9 ?  r* i( y
2 ?8 T5 P- o6 z  w#define MAX_BUF_SIZE 1024
; |0 R9 A4 P' q. X4 s* Wvoid udpc_requ(int sockfd,const struct sockaddr *addr,int len)6 a: }7 i: }1 E8 p' M
{ 3 P0 m6 j6 X# y1 F; l
  char buffer[MAX_BUF_SIZE];
* E& E9 p2 ~' [/ d. R5 F  int n; 2 t0 a- p: {$ s: h, {# L
  while(1) ( t( ^9 B7 M8 f+ Z5 |; o, n
  {
9 B2 \7 z! e& i& v- c6 I   fgets(buffer,MAX_BUF_SIZE,stdin);1 {6 l9 |# f( v' c
   sendto(sockfd,buffer,strlen(buffer),0,addr,len);3 P3 |3 o% O0 p1 k/ \
   bzero(buffer,MAX_BUF_SIZE);  
% G8 D3 _& C( `2 c  {   n=recvfrom(sockfd,buffer,MAX_BUF_SIZE,0,NULL,NULL);
0 A. l$ Y$ z- j" X) V& M/ S( }. r2 h   buffer[n]=0;
' k4 l5 {5 g1 D/ g   fputs(buffer,stdout);5 \" y5 l, O% M, v( B+ d
}
+ K& F) h6 q6 S8 F" Z, f( P}
% q$ D) }0 c4 H- @; @; s1 B2 q7 c: P: c: b( B
int main(int argc,char **argv) " `8 Q) m4 e6 J2 f5 Q' j5 j
{ # C$ U9 E3 b- G
  int sockfd,port;1 a% L# p" p! ^7 Q+ B2 r
  struct sockaddr_in addr;
1 W5 r' U) b- I. h/*  if(argc!=3)
0 u0 L8 r+ D) l3 `   { , X+ B9 L, G' \2 \( D5 F$ p
    printf("\nPlease input Server IP and Server port\n");5 f0 [5 j1 c# X' r* h
    exit(1);
4 T* f+ R0 y  i- z0 C! ]& u+ D   } */
) s. U& }# ?. L3 D- x  o  if((port=atoi(argv[2]))<0)8 _/ q, I+ r, r( R6 Q+ b4 V
  {
6 l1 Z- r) `/ ~9 E* I# v2 i    printf("\npara error,Please input Server IP and Server port\n");% I# T& U5 F2 i* h3 p( S8 _# {0 ^) c
    exit(1); ( V: B9 R. b# u8 S! n  Q
  }
4 `7 D+ T) J3 n/ @  sockfd=socket(AF_INET,SOCK_DGRAM,0);" W  ]7 h/ L1 K
  if(sockfd<0); V/ g3 c' D5 l* `
  { 4 g& p+ R) d- e& c6 Q) y
    printf("Socket Error:");
/ W" a. n3 ~9 E4 }    exit(1); 9 ^* F. t! t  u" Q. \/ o! a
  }
. v5 O7 H$ M, B
2 Y- y5 n2 c6 }# `: e: }9 g, s, b& \  bzero(&addr,sizeof(struct sockaddr_in));
: i. m/ b+ h4 R# w( m: |9 l  addr.sin_family=AF_INET;
2 {: |% q9 F. C5 t9 _  addr.sin_port=htons(port); 9 h4 S- s* @, W/ p3 o) Z3 R
  if(inet_aton(argv[1],&addr.sin_addr)<0)
/ L5 T8 `! u. D: |4 i# O   {
1 y  V- o2 `& u9 A* F    printf("Ip error:");
' P' x  W' M9 P4 a( B    exit(1); 9 e7 @0 g; {8 N0 ?
   }8 N; N* p) @4 R! t
   udpc_requ(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));2 P, L" f6 X7 U5 b  q
   close(sockfd); 4 I' U$ v! e# j3 U- R
}
# g6 ?  W! p9 y" O9 I
4 j) t6 o) M0 j8 ]
% |! D' T2 \) {$ c% H/*server_udp.c*// m7 X! ^9 S! }7 c4 P+ b0 I6 J" ]
#include <stdio.h>; x/ f) n% w( Z+ ?& A/ A9 J
#include <sys/types.h>+ G/ h1 Y9 F$ F0 |
#include <sys/socket.h>
7 f, |( M9 x& R( I7 E#include <errno.h>
/ W, u! [, T+ H( C  k. P#include <stdlib.h>
$ Z$ C+ O5 V5 m& V. X#include <time.h>
  C: [8 O& L+ ~- c#include <netinet/in.h>    /* define address struct sockaddr_in */8 ?1 `1 D, |& M  a* n! r
#define SERVER_PORT 8888
. \/ w) H  t$ B$ k- b! R1 b" ]#define SERVER_ADDR "202.112.0.12"
, K7 A! p; K; A) a8 F+ W#define MAX_MSG_SIZE 1024 ! J8 X. {# G* x& y% q6 [

+ g3 Y; X  S( ]8 J" Ovoid udps_respon(int sockfd)3 a. m0 J4 w, W$ w
{ ) D5 S9 v1 Q/ i  q
  struct sockaddr_in serv_addr;
. H1 O& l, ]3 u. J" [  int addrlen,n;
5 V- V3 M) E, o* c  char msg[MAX_MSG_SIZE];5 f! H+ Y5 K, y
  while(1)
3 ~+ L: `3 e, K& Z# I4 |  {
8 C2 k) n$ n, w( W- L   n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0, (struct sockaddr*)&serv_addr,&addrlen);
2 T7 p3 i5 v. [( i- G   msg[n]=0;   h/ M- _# N4 w( _- y  z" C! |7 w
   fprintf(stdout,"I have received %s",msg);
, f& O/ f; r  L. t   sendto(sockfd,msg,n,0,(struct sockaddr*)&serv_addr,addrlen);
" D$ O. ]/ v1 A4 o1 _6 A  }
% m1 P0 T2 y8 L& v! P" c}
$ e7 O  `5 }/ t' P& k4 l# s8 n1 b( a6 C3 v( b# b
int main(void) 3 B1 R- J$ w; m0 B+ C5 F+ A( {
{
. T" E: T. h, a! l' h  int sockfd;
) o2 I* s% P+ F8 I$ h  int ret;
- C* j$ P" d* M% j2 z$ l  struct sockaddr_in addr; 0 ~4 Z& w7 d% e  S: r+ G
  sockfd=socket(AF_INET,SOCK_DGRAM,0);
6 L' W) {9 G( N  if(sockfd<0) 5 G5 h: M. [: ?; V
  {   a1 b9 |  V+ d& ?
   printf("Socket Error");$ Z6 ?2 Y6 T5 U9 s% d, G% y
   exit(1);   x( W# i, o6 R3 N0 X
  } ( O* N+ a, l  [4 g; e; C% Q
  bzero(&addr,sizeof(struct sockaddr_in)); 1 j; x9 a0 }) u! m+ @% ^
  addr.sin_family=AF_INET;
! M  |+ ^7 N5 `* T1 H  addr.sin_addr.s_addr=htonl(inet_addr(SERVER_ADDR)); 2 ]7 {+ K/ h- J- l5 L4 W
  addr.sin_port=htons(SERVER_PORT);
( j  }+ o, X! g6 @3 q6 _  ret=bind(sockfd,(struct sockaddr *)&addr,sizeof(addr));
* `; L! M5 k! J$ T+ |7 X  if(ret<0)
4 F  C. [. t6 G5 w: K. w  {
( C& Q  s5 t, A9 w* v   printf("Bind Server Port Error"); - j6 R- m1 w% f- R' d! s% V
   exit(1);
! s& c( @' ~4 [. p. h+ P, v! B  } / }1 m1 @  e8 R7 q' |( m& B
  udps_respon(sockfd);1 S. l% C% b/ _2 w/ y5 @
  close(sockfd);
. j3 Q. R. _8 D2 r) Q; R9 y}
: N9 T5 C+ C5 q, k% \6 a
, ~& s% P3 h! O+ V& V现在的问题是我不知道该怎么测试这两个程序,我用
% w& b% r1 L1 A6 b& C1 l( ~./client_udp my-server-IP my-server-port  asdfasdfa测试client端,但是后面无论输入多少字符都不退出.在一台机器上可以测试这两个程序吗,多谢啦!2 W- h. E- G* x4 ?
( G& O9 d! W/ g( A0 X
      

TOP

发新话题