非连接的通信是一种什么情况呢?
可以通过sedto向任何一个套接口发送数据,如果想收听某一套接口上别人发送过来的数据,通过bind绑定到这个套接中,使用recvfrom接收.
如果想做应答,那么通过recvfrom的第五个参数知道了发送过来程序的情况,进而可以对这个程序进行应答.这样就可以多个程序向这一个套接口进行发数据,并由服务端进行不同的应答.好比多个程序发送过来不同的需要计算的字符串列式,而在服务器端计算好了再返回给不同的程序.
服务端:
srvr_addr = "127.0.0.23";
s = socket(AF_INET,SOCK_DGRAM,0);
memset(&adr_inet,0,sizeof adr_inet);
adr_inet.sin_family = AF_INET;
adr_inet.sin_port = htons(9090);
adr_inet.sin_addr.s_addr =
inet_addr(srvr_addr);
len_inet = sizeof adr_inet;
z = bind(s,
(struct sockaddr *)&adr_inet,
len_inet);
for (;;) {
len_inet = sizeof adr_clnt;
z = recvfrom(s, /* Socket */
dgram, /* Receiving buffer */
sizeof dgram, /* Max recv buf size */
0, /* Flags: no options */
(struct sockaddr *)&adr_clnt,/* Addr */
&len_inet); /* Addr len, in & out */
if ( z < 0 )
bail("recvfrom(2)");
dgram[z] = 0; /* null terminate */
printf("srvr dgram = %s\n", dgram);
}
客户端:
srvr_addr = "127.0.0.23";
memset(&adr_srvr,0,sizeof adr_srvr);
adr_srvr.sin_family = AF_INET;
adr_srvr.sin_port = htons(9090);
adr_srvr.sin_addr.s_addr =
inet_addr(srvr_addr);
len_inet = sizeof adr_srvr;
s = socket(AF_INET,SOCK_DGRAM,0);
for (;;) {
sleep(1);
dgram[0] = 'a';
dgram[1] = 'b';
z = strlen(dgram);
if ( z > 0 && dgram[--z] == '\n' )
dgram[z] = 0; /* Stomp out newline */
z = sendto(s, /* Socket to send result */
dgram, /* The datagram result to snd */
strlen(dgram), /* The datagram lngth */
0, /* Flags: no options */
(struct sockaddr *)&adr_srvr,/* addr */
len_inet); /* Server address length */
printf("clnt dgram = %s\n", dgram);
}