基于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;
strcpy ( serveraddr. sun_path, "./udp server" ) ;
if ( - 1 == bind ( sock_fd, ( struct sockaddr * ) & serveraddr, serveraddr_len) )
{
perror ( "bind error" ) ;
exit ( - 1 ) ;
}
四、服务器 端收发数据(recvfrom函数、sendto函数):
memset ( buf, 0 , sizeof ( buf) ) ;
int ret1 = recvfrom ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & clientaddr, & clientaddr_len) ;
if ( - 1 == ret1)
{
perror ( "recvfrom error" ) ;
exit ( - 1 ) ;
}
printf ( "客户端[%s]发来消息[%s]\n" , clientaddr. sun_path, buf) ;
strcat ( buf, "---------k" ) ;
int ret2 = sendto ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & clientaddr, clientaddr_len) ;
if ( - 1 == ret2)
{
perror ( "sendto error" ) ;
exit ( - 1 ) ;
}
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;
strcpy ( serveraddr. sun_path, "./udp server" ) ;
if ( - 1 == bind ( sock_fd, ( struct sockaddr * ) & serveraddr, serveraddr_len) )
{
perror ( "bind error" ) ;
exit ( - 1 ) ;
}
printf ( "基于UDP的本地通信服务器 启动!!!\n" ) ;
char buf[ 128 ] = { 0 } ;
while ( true)
{
memset ( buf, 0 , sizeof ( buf) ) ;
int ret1 = recvfrom ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & clientaddr, & clientaddr_len) ;
if ( - 1 == ret1)
{
perror ( "recvfrom error" ) ;
exit ( - 1 ) ;
}
printf ( "客户端[%s]发来消息[%s]\n" , clientaddr. sun_path, buf) ;
strcat ( buf, "---------k" ) ;
int ret2 = sendto ( sock_fd, buf, sizeof ( buf) , 0 , ( struct sockaddr * ) & clientaddr, clientaddr_len) ;
if ( - 1 == ret2)
{
perror ( "sendto error" ) ;
exit ( - 1 ) ;
}
}
close ( sock_fd) ;
return 0 ;
}
基于UDP的本地通信服务器 启动! ! !
客户端[ . / udp client] 发来消息[ hello]
客户端[ . / udp client] 发来消息[ I Love China! ! ! ]
客户端[ . / udp client] 发来消息[ miss U]
特别注意: strcpy(serveraddr.sun_path,"./udp server");
中udp server文件
是套接字文件
;如下所示:
srwxrwxr- x 1 linux linux 0 11 月 11 01 : 18 udp server