发新话题
打印

【求助】socket网络编成时,UDP/IP协议广播

【求助】socket网络编成时,UDP/IP协议广播

服务端:
- R$ ?: z# O# A# _8 ]#include <sys/types.h> 4 ~1 |: f3 g3 K+ z7 Z% x
#include <sys/socket.h>
) j- z. u3 ?# d; o5 d& A#include <netinet/in.h>
- m/ K2 |+ k1 q#include <string.h> 2 L  `4 s5 T4 j6 F1 K
#include <stdio.h>
: F3 D) [/ E' @. s * P0 ^5 {% [; A
#define  SERVER_PORT    8888
- \% k: }+ l; c% l/ d4 \#define  DATASIZE              100 . ^" z, [/ d& D
, l7 Q2 n1 [. X! _' Q. S& Q2 X; ?
void udps_respon(int sockfd) 8 G+ n% [# v9 J" ?9 o
{ 7 y1 T/ z2 y2 o8 X+ Y- X
  int                 n;
  i! _; c+ e2 z& [( b% Q  int                  addrlen;
* [# H- U5 R- G  T' p' K, f# D  char                recvbuf[DATASIZE];8 M& D$ c' Y% S; x
  char*               sendbuf;
5 I' u! `. x" N! p; a  char*               client_ip;
8 |6 j! t, p( {" k% f  struct sockaddr_in  client_addr; 0 S, _' d" C% T7 ]4 n" T9 F
   / |; Y+ d9 n1 d6 {) N' e0 x
  n=recvfrom(sockfd,recvbuf,DATASIZE,0,(struct sockaddr*)&client_addr,&addrlen);
: f9 P$ I5 ~% N8 a9 A5 a& H  recvbuf[n]='\0'; ! d2 v% r) z* Q
  client_ip=inet_ntoa(client_addr.sin_addr);
- f& ]% O7 I3 M  printf("I recieved data from:'%s'.\n",client_ip);
. E' p; W2 i3 s  printf("I have received '%s'.\n",recvbuf);
8 H# [* u; X1 S& b, f  sendbuf="OK! You did a good job!!";
, d* j7 q9 [* G1 l& V2 x  n=strlen(sendbuf);
) Y( G$ c+ t! l; g9 a  sendto(sockfd,sendbuf,n,0,(struct sockaddr*)&client_addr,addrlen);
4 ^& y* Z+ f9 Y6 J. d3 t; Y+ i}+ W+ U6 F6 c# R6 y
2 D4 l' D4 ~( Y( S- D/ l
int main(void)
& t) |5 g9 N2 U  m6 ?8 A) R8 u  \. p  F{
2 u/ K7 d; l8 D; F  int                  sockfd; 3 K2 G5 a& t. Y& r0 T2 Q
  struct sockaddr_in   server_addr;
; I9 i5 |  l1 y0 _  if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)4 X1 {9 H. |$ {
    { 8 v5 n- m2 U1 a0 A( O) r- p3 C
      printf("Socket Error.\n");
' N9 t* b( }  {& c$ Y$ k2 a      exit(1); * O8 S# l3 Q# t, s
    }
, a. D7 N: m! N  bzero(&server_addr,sizeof(struct sockaddr_in)); . u! n- K6 k! ~
  server_addr.sin_family=AF_INET;
+ ]0 h2 V3 Q; B$ ^% R/ S  server_addr.sin_addr.s_addr=htonl(INADDR_ANY); . H/ C+ Y; ]/ N! L8 U4 _
  server_addr.sin_port=htons(SERVER_PORT); ! @6 ]- ~# G3 z0 B. Y5 c0 n
  if(bind(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr_in))<0 ) 9 ~  ~+ D7 r: g! x
    { / T) L' X2 q& R# w( ?' S2 o
      printf("Bind Error.\n");
& z$ |* o- ^, B" |; F      exit(1);
$ p* Z2 g8 a) l    }& Z8 o, c8 k. m: y# @9 g  E
# l1 T4 B6 J+ B! _
  udps_respon(sockfd);
1 W9 ]7 p5 ~" y3 V8 a5 b1 U' [  close(sockfd);
/ T; w( Q3 F+ X$ P. Z}
( m7 d" y! X4 |: C2 ]% E
0 K( H; S1 @2 ?2 q. G
( k" d/ |% b% z$ A  O客户端:
% @: z$ x* U0 F9 k7 P- Z+ P#include <sys/types.h> 2 B5 |' a# r0 f9 e0 D
#include <sys/socket.h>
8 L( Y9 G3 X+ r& y" q) G" B#include <netinet/in.h> 4 D+ J7 ^4 \: E1 @! D& r
#include <string.h>
5 _3 _3 t* h; ~4 ^* R; V1 d#include <stdio.h>
( F: Y0 e! _* K& S3 \8 b#include <unistd.h> $ S/ R! x' S+ ~& \! i
- ^1 x( _, B( \( d; ^
#define  IPADDR          "255.255.255.255"
6 n5 P  ]# W" R4 C#define  PORT              8888
6 ], G' L2 ^! v# h2 T#define  DATASIZE       100  % y. B/ S, y, [$ w$ U. j) {
% g8 t% N, Y) {4 k
void udpc_requ(int sockfd,const struct sockaddr_in *server_addr,int addrlen) " X2 J1 \* u8 j" w" r3 D3 q
{
8 V) ^$ a, Y9 [0 J; ^  int                 n;. O1 v' v' n  T3 l  i. n4 ~# r
  int                 server_addrlen;) M/ @0 V5 U: `5 ]: x
  char                sendbuf[DATASIZE]; 5 e1 P+ p  G' B& s% H# t5 R
  char                recvbuf[DATASIZE];
# N  H) e! U" e' F: H  e  char*               server_ip; / ^8 v) t/ R9 A( @, u6 K. \
  struct sockaddr_in  server;9 |+ J8 P, i0 Z# O' N* F1 J
# G$ w" N3 f- O* G, Y0 M
  printf("lease input string:");
( S% H) V, C  ~$ @% X2 _; `  fgets(sendbuf,DATASIZE,stdin);
3 {0 ?/ y1 Z% O  sendto(sockfd,sendbuf,strlen(sendbuf)-1,0,server_addr,addrlen);' g; |5 ], l6 h+ L
  printf("I have send: %s",sendbuf);. |5 e) f5 R! R4 E3 z2 _
  n=recvfrom(sockfd,recvbuf,DATASIZE,0,(struct sockaddr *)&server,&server_addrlen);
1 h5 I7 ^: E4 ~" Y" L8 p  F0 |  recvbuf[n]='\0';
* @6 i4 {! x4 y3 w% n: _( ]( ]  server_ip=inet_ntoa(server.sin_addr);( {  F" @" [. I7 Y" U5 `' E
  printf("I have recieved data from:%s.\n",server_ip);
9 s5 M0 c# A/ W! _/ F& s  printf("I have recieved:'%s'.\n",recvbuf);
: r1 }. F6 a0 B- s! l, B( f/ `- @3 o4 I* \}
5 V1 n3 |( \( j% n) p0 Z; ]
/ f) k4 K( l3 b: V1 V6 g- B. wint main() 8 F+ R, k3 v# v
{ / i/ b; W1 v& p( H
  int                 sockfd;
. n6 e1 _, Z* r! i$ f  struct sockaddr_in  addr; ) U. ?' y! i& r0 E; T
  if((sockfd=socket(AF_INET,SOCK_DGRAM,0))<0) 5 {; g8 h/ M/ V
    {
! c8 s  S2 r/ ?) p5 l      printf("Socket Error.\n");
4 }3 g3 P9 Y# L" V/ e, _      exit(1);
  H1 o' u& F1 i    }4 P4 N* E% f  w$ z' j, H' g/ G
  
+ I; P# Z: q: k  bzero(&addr,sizeof(struct sockaddr_in));
4 u; ]! p, ]5 A; r4 J& ~4 s7 ~  addr.sin_family=AF_INET;5 G9 n; x! j. E  h$ r
  addr.sin_port=htons(PORT);- g& E' L/ [. @- w- J* ~* U
  if(inet_aton(IPADDR,&addr.sin_addr)<0)/ Z) y, Y* k9 O4 d; D; I# A, W
    {
( F% U* d3 x$ g- [9 V0 v      printf("IPADDR error.\n");1 B" o# x# y' g$ ?' I
      exit(1);
( V# n6 H% E, G9 x    } 4 \" S# S1 I" o
  udpc_requ(sockfd,&addr,sizeof(struct sockaddr_in));
% u; ^( H8 v, _; v0 R; V) e  close(sockfd);
* J- q. o/ V$ S5 Y1 ^}
* D  R$ q( q3 X: F, ]
! F8 |3 {) A% [# P8 D9 j; p****************************************************************************************************9 T+ u5 t& N1 P! H' e* Z( S
客户端定义发送消息的ip地址为:255.255.255.255 广播地址,为什么服务端收不到信号?
. z- x0 o# l8 W# x3 u8 j% e, |( j! i小弟初学网络编程,还请各位大牛指教.      

TOP

You should open setsockopt( ) to make the sock_api support the broadcasting.      

TOP

发新话题