基于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, "./udpserver" ) ; strcpy ( clientaddr. sun_path, "./udpclient" ) ;
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, "./udpserver" ) ; strcpy ( clientaddr. sun_path, "./udpclient" ) ; 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服务器[ . / udpserver] 发来应答消息[ hello-- -- -- -- - k] I Love China! ! ! 服务器[ . / udpserver] 发来应答消息[ I Love China! ! ! -- -- -- -- - k] miss U服务器[ . / udpserver] 发来应答消息[ miss U-- -- -- -- - k]
特别注意: strcpy(serveraddr.sun_path,"./udpserver");
和strcpy(clientaddr.sun_path,"./udpclient");
代码段中的udpserver文件
、udpclient文件
是套接字文件
;如下所示:
srwxrwxr- x 1 linux linux 0 11 月 11 01 : 18 udpclientsrwxrwxr- x 1 linux linux 0 11 月 11 01 : 18 udpserver