基于UDP的本地通信(客户机): 创建流程: 一、创建数据报式套接字(socket函数):
int sock_fd = socket ( AF_UNIX, SOCK_DGRAM, 0 ) ;
if ( - 1 == sock_fd)
{
perror ( "socket error" ) ;
exit ( - 1 ) ;
}
二、创建客户机和服务器 的本地网络信息结构体并填充客户机和服务器 本地网络信息结构体 (struct sockaddr_un): 本地网络信息结构体:
# include <sys/un.h>
struct sockaddr_un {
sa_family_t sun_family;
char sun_path[ 108 ] ;
} ;
struct sockaddr_un serveraddr, clientaddr;
socklen_t serveraddr_len = sizeof ( serveraddr) ;
socklen_t clientaddr_len = sizeof ( clientaddr) ;
memset ( & serveraddr, 0 , serveraddr_len) ;
memset ( & clientaddr, 0 , clientaddr_len) ;
serveraddr. sun_family = AF_UNIX;
clientaddr. sun_family = AF_UNIX;
strcpy ( serveraddr. sun_path, "./udp server" ) ;
strcpy ( clientaddr. sun_path, "./udp client" ) ;
if ( - 1 == bind ( sock_fd, ( struct sockaddr * ) & clientaddr, clientaddr_len) )
{
perror ( "bind error" ) ;
exit ( - 1 ) ;
}
四、客户机端发收数据(sendto函数、recvfrom函数):
memset ( buf, 0 , sizeof ( buf) ) ;
fgets ( buf, sizeof ( buf) , stdin ) ;
buf[ strlen ( buf) - 1 ] = '\0' ;
int ret1 = sendto ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & serveraddr, serveraddr_len) ;
if ( - 1 == ret1)
{
perror ( "sendto error" ) ;
exit ( - 1 ) ;
}
int ret2 = recvfrom ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & serveraddr, & serveraddr_len) ;
if ( - 1 == ret2)
{
perror ( "recvfrom error" ) ;
exit ( - 1 ) ;
}
printf ( "服务器 [%s]发来应答消息[%s]\n" , serveraddr. sun_path, buf) ;
close ( sock_fd) ;
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <sys/socket.h>
# include <sys/types.h>
# include <unistd.h>
# include <stdbool.h>
# include <sys/un.h>
# include <arpa/inet.h>
# include <netinet/ip.h>
int main ( int argc, char const * argv[ ] )
{
int sock_fd = socket ( AF_UNIX, SOCK_DGRAM, 0 ) ;
if ( - 1 == sock_fd)
{
perror ( "socket error" ) ;
exit ( - 1 ) ;
}
struct sockaddr_un serveraddr, clientaddr;
socklen_t serveraddr_len = sizeof ( serveraddr) ;
socklen_t clientaddr_len = sizeof ( clientaddr) ;
memset ( & serveraddr, 0 , serveraddr_len) ;
memset ( & clientaddr, 0 , clientaddr_len) ;
serveraddr. sun_family = AF_UNIX;
clientaddr. sun_family = AF_UNIX;
strcpy ( serveraddr. sun_path, "./udp server" ) ;
strcpy ( clientaddr. sun_path, "./udp client" ) ;
if ( - 1 == bind ( sock_fd, ( struct sockaddr * ) & clientaddr, clientaddr_len) )
{
perror ( "bind error" ) ;
exit ( - 1 ) ;
}
printf ( "基于UDP的本地通信客户机启动!!!\n" ) ;
char buf[ 128 ] = { 0 } ;
while ( true)
{
memset ( buf, 0 , sizeof ( buf) ) ;
fgets ( buf, sizeof ( buf) , stdin ) ;
buf[ strlen ( buf) - 1 ] = '\0' ;
int ret1 = sendto ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & serveraddr, serveraddr_len) ;
if ( - 1 == ret1)
{
perror ( "sendto error" ) ;
exit ( - 1 ) ;
}
int ret2 = recvfrom ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & serveraddr, & serveraddr_len) ;
if ( - 1 == ret2)
{
perror ( "recvfrom error" ) ;
exit ( - 1 ) ;
}
printf ( "服务器 [%s]发来应答消息[%s]\n" , serveraddr. sun_path, buf) ;
}
close ( sock_fd) ;
return 0 ;
}
基于UDP的本地通信客户机启动!!!
hello
服务器 [ . / udp server] 发来应答消息[ hello-- -- -- -- - k]
I Love China! ! !
服务器 [ . / udp server] 发来应答消息[ I Love China! ! ! -- -- -- -- - k]
miss U
服务器 [ . / udp server] 发来应答消息[ miss U-- -- -- -- - k]
特别注意: strcpy(serveraddr.sun_path,"./udp server");
和strcpy(clientaddr.sun_path,"./udp client");
代码段中的udp server文件
、udp client文件
是套接字文件
;如下所示:
srwxrwxr- x 1 linux linux 0 11 月 11 01 : 18 udp client
srwxrwxr- x 1 linux linux 0 11 月 11 01 : 18 udp server