基於UDP的C/S網路程式設計模型(使用sendto和recvfrom函式)
阿新 • • 發佈:2019-01-07
#include #include #include #include #include #include #define MAX_CLIENT_NUM 10 #define LOG_ERROR(module_id, format...) \ do{ \ printf(format); \ }while(0) int main(int argc, char *argv[]) { int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_un server_sockaddr; struct sockaddr_un client_address; int i; int bytes; char ch_send,ch_recv; unlink ("/home/user/test/server"); server_sockfd = socket(AF_UNIX, SOCK_DGRAM, 0); //建立 socket, 通訊協議為AF_UNIX, SOCK_DGRAM 資料方式 if (server_sockfd < 0) { LOG_ERROR(SERVER_DAEMON_ID, "Socket create failed, error: %s\n", strerror(errno)); exit (EXIT_FAILURE); } bzero(&server_sockaddr, sizeof(server_sockaddr)); server_sockaddr.sun_family = AF_UNIX ; //配置伺服器資訊(通訊協議) strcpy(server_sockaddr.sun_path, "/home/user/test/server"); server_len = sizeof(server_sockaddr); //配置伺服器資訊(伺服器地址長度) if (bind(server_sockfd, (struct sockaddr *)&server_sockaddr, server_len) < 0) { LOG_ERROR(SERVER_DAEMON_ID, "Socket bind failed, error: %s\n", strerror(errno)); exit (EXIT_FAILURE); } client_len = sizeof(client_address); for (i = 0, ch_send = '1'; i < 5; i++, ch_send++) { if ((bytes = recvfrom(server_sockfd, &ch_recv, 1, 0, (struct sockaddr *)&client_address, (socklen_t *)&client_len)) == -1) { perror ("recvfrom"); exit (EXIT_FAILURE); } printf ("The character receiver from client[%s] is %c\n", client_address.sun_path, ch_recv); sleep (1); if ((bytes = sendto(server_sockfd, &ch_send, 1, 0, (struct sockaddr *)&client_address, client_len)) == -1) { perror ("sendto"); exit (EXIT_FAILURE); } } close (client_sockfd); unlink ("/home/user/test/server"); }