【求助】socket问题
这段程序编译没有问题,执行时候,我调试了一下,结果提示bind fail,setsockopt fail,还有n个recvfrom error,说socket operation on non-socket,难道服务器端也必须是socket吗?(buf里的内容拷到wenjian里)我是用 vlc7 D! J6 S; u( z
直接发送组播ip:239.1.1.1 端口8888.
# l- B& q, l: i5 \1 ` G- V* p/ G& B
#include<sys/types.h>3 n8 G9 N) v! B# X
#include<sys/socket.h>
+ F. O" ~2 d* f' y#include<netinet/in.h>. @6 C) O6 j8 j6 k% T# D/ j
#include<arpa/inet.h>/ j" q' \ ?, H, z' A* [5 a" U' l3 }
#include<stdio.h>8 [. p' ?5 g8 J1 Q9 e) c3 I4 L$ B
#include<string.h>
" A3 R5 a( n$ b0 D! E% F+ A1 H! F0 j) X1 r! @
#define MAXBUF 256
2 \. L9 n; @3 @; x/ b( X! c9 Z#define PORT 8888
+ k+ r6 c) G0 E#define GROUP "239.1.1.1"% v( L* n" r* _9 V, F% w; n8 }. R
v0 X* T1 @9 @4 C9 ^0 w1 |* xint main(void)
. u! P' N, C" m' M{ 6 m; p0 X Z' t
FILE *fp; //创建一个文件,用于接受数据,组播信号! k+ U1 U) M3 m
fp=fopen("wenjian","ab");
- c% E8 F- m) E, h9 q* I int fd; $ W- a1 e0 Q* l1 M
int r; //r为recv的返回值
" ]# G6 d, i! R g/ `4 z, s1 L8 r struct sockaddr_in srv;4 T2 S+ }+ ~- C* w+ c/ U( V
struct ip_mreq mreq;//组播地址信息/ e4 E* E2 i2 h. r! f4 Y; v4 e
. V$ O' E3 \ R2 {1 t- N memset(&srv,0,sizeof(struct sockaddr_in));! ^- x ~: p7 N: A) v* X3 d; Z7 c$ U
memset(&mreq,0,sizeof(struct ip_mreq));
! |. x+ F4 d0 }- f9 O6 N3 q1 D5 i4 D, v3 I: v7 e
srv.sin_family=AF_INET;
0 y! [. n/ b$ K6 g/ l8 w; r& v srv.sin_port=htons(PORT);
/ N8 G& o x: m1 {, G. S" P ^" L- w0 j
1 P( w3 \& U( {% {' G$ I3 w$ [2 l; Y5 G0 S) N$ r
if(inet_aton(GROUP,&srv.sin_addr)<0)
; ^; k O4 f' J( w {9 P! ~9 N" ` {" N, Q
perror("inet_aton fail");, Q% p# M" q4 e1 y% @
return 1;
4 V* h0 h# ` |& E% f }( V2 l( `# _* \+ s& x
if(fd=socket(AF_INET,SOCK_DGRAM,0)<0)
F4 z" Z0 E$ ~% b3 |( h {6 ~/ a3 ~0 @+ K: @4 ?) S
perror("socket fail");
; F# ~% Z% k$ K/ Z return 1;
$ K, i% w* b2 K( u j4 F8 g }
; P; }6 K( }5 V" E/ q) T if(bind(fd,(struct sockaddr*)&srv,sizeof(srv))<0); [! u/ q Z* e5 g! s z
{ I4 K2 f4 B3 B/ ]
perror("bind fail");
7 b5 T# p# o; {* t) |' u return 1;; b" m( Q" n& x9 e3 j
}9 i* x5 C, T3 f+ I0 c
if(inet_aton(GROUP,&mreq.imr_multiaddr)<0)
: X$ U) @) T$ W- g; N/ ? {
+ b1 s- D( w8 S0 m# N! V perror("inet_aton fail");0 R! Q' t* m) `* X2 K- w
return 1;
8 g. H3 ]# R! P( m( H }$ l6 V) Y- e. a% _
& R5 J1 ]) C- e$ J inet_aton("192.168.177.128",&(mreq.imr_interface));//虚拟机下linux下的ip: W9 m* u, A: W
/ _8 W/ ]% N g O: e. ?6 H mreq.imr_interface.s_addr=htonl(PORT);
. ?, ~, D/ i* d" x
' y3 v* l* j2 w( @6 G' |3 D if(setsockopt(fd,SOL_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq))<0)
' i" w- G( {( ~7 S# d0 R0 m9 w; g' M {' x; `# v6 w) V6 u) w
perror("setsockopt fail");
* E3 \: l4 [) a$ o6 z" p K# z 2 m5 @ t- K. d% @6 S' B
return 1;2 f8 y7 r9 R5 {8 X( g, v3 V9 K
} K- ^( z3 d( k( P* m0 r9 f( c3 O
if(connect(fd,(struct sockaddr*)&srv,sizeof(struct sockaddr))==-1)
, U5 R' k3 |1 }; j3 D {, b& u3 N: B4 ^9 g3 {: _. a
fprintf(stderr,"connect error");
2 t' N, Q! g. F2 Z. c/ N8 F }, z; D: h# U4 r4 e- t8 X( d
7 i7 C$ [+ V0 j2 B$ X
. `/ R/ j! I; M' ?" l struct sockaddr_in client; : t1 a, N/ Y) Y+ M$ G* r; F; R
memset(&client,0,sizeof(struct sockaddr_in));5 L, c- E9 P* y7 u- O' r9 L
int len=sizeof(client);* O6 o" {4 G6 P& P
char buf[MAXBUF];' o# o* ~2 f7 Q- z, l
char *ptr=buf;7 a2 o" T& o/ `: G# Q f, G
int write_byte=len;
y2 o, j1 i3 m% x, a" r- r8 U; E
5 M1 f( h/ x+ p3 I( { while(1)8 J" s3 @: E7 n$ B5 Y( @' U8 B
{+ Y* |' A, U* M6 O( b+ O& ]8 d
if((r=recvfrom(fd,buf,MAXBUF,0,(struct sockaddr*)&client,(socklen_t*)&len))<0)
) }5 @8 I& P A' n) C {5 h% p" F% d3 d- Q1 H6 i( T- Y
perror("recvfrom error");& U5 t9 I/ O' j, j3 q
}7 L: I3 C- A9 ]( k& _) d
else
8 a1 l3 E+ H6 L" L; z" V! c {; Z% t q; R+ n& a
buf[r]=0;" i$ O' E9 q& t. `5 W' y2 \
write(fp,*ptr,sizeof(buf));
* ^/ a, I( c) X1 r4 i/ u& c fclose(fp);
+ ^7 X) k% V) _0 G /*fprintf(stdout,"%s:%s",inet_ntoa(client.sin_addr),buf);*/8 i/ I4 C* P$ L0 Q! E9 X$ k! b8 M
}
) a7 z8 c7 X& V }
+ d+ i/ s! K0 e% A4 h}