AF_UNIX伺服器以及客戶端(C)
阿新 • • 發佈:2019-02-16
1.伺服器
#include <stdio.h> #include <unistd.h> #include <netdb.h> #include <net/if.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <pthread.h> #include <time.h> #include <string.h> #include <sys/un.h> #define BUF_SIZE (1024) #define errlog(errmsg) do{perror(errmsg);\ printf("%s-->%s-->%d\n", __FILE__, __func__, __LINE__);\ exit(1);}\ while(0) int main(int argc, char **argv) { int iServerSockfd, iClientSockfd; ssize_t recvRet, sendRet; int iRet; char recvBuf[BUF_SIZE] = {0}; char sendBuf[BUF_SIZE] = {0}; struct sockaddr_un serverAddr, clientAddr; socklen_t addrLen = sizeof(serverAddr); printf("UNIX SERVER Start################################\n"); bzero(&serverAddr, addrLen); bzero(&clientAddr, addrLen); unlink("socket"); iServerSockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(iServerSockfd < 0){ errlog("fail to socket\n"); } /*填充*/ serverAddr.sun_family= AF_UNIX; strcpy(serverAddr.sun_path, "/tmp/socket"); iRet = bind(iServerSockfd, (struct sockaddr *)&serverAddr, addrLen); if(iRet < 0){ errlog("fail to bind serverAddr\n"); } if(listen(iServerSockfd, 1) < 0){ errlog("listen error\n"); } printf("The Unix Server is waiting client to connect...\n"); iClientSockfd = accept(iServerSockfd, (struct sockaddr *)&clientAddr, &addrLen); if(iClientSockfd < 0){ errlog("can not accept client socket fd\n"); } printf("The Unix Server is waiting to recv data from client...\n"); while(1){ recvRet = read(iClientSockfd, recvBuf, BUF_SIZE); if(recvRet < 0){ errlog("read error\n"); }else if(recvRet == 0){ printf("No Data!\n"); }else{ printf("from client data :%s\n", recvBuf); } memcpy(sendBuf, recvBuf, BUF_SIZE); strcat(sendBuf, "*-*"); sendRet = write(iClientSockfd, sendBuf, BUF_SIZE); if(sendRet < 0){ errlog("write\n"); } } close(iServerSockfd); close(iClientSockfd); }
2.客戶端
#include <stdio.h> #include <unistd.h> #include <netdb.h> #include <net/if.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <pthread.h> #include <time.h> #include <string.h> #include <sys/un.h> #define BUF_SIZE (1024) #define errlog(errmsg) do{perror(errmsg);\ printf("%s-->%s-->%d\n", __FILE__, __func__, __LINE__);\ exit(1);}\ while(0) int main(int argc, char **argv) { int iClientSockfd; int iRet; char sendBuf[BUF_SIZE] = "The Data from Unix Client for Unix test..."; char recvBuf[BUF_SIZE] = {0}; ssize_t recvRet, sendRet; struct sockaddr_un clientAddr; socklen_t addrLen = sizeof(clientAddr); bzero(&clientAddr, addrLen); printf("UNIX CLIENT Start########################\n"); iClientSockfd = socket(AF_UNIX, SOCK_STREAM, 0); if(iClientSockfd < 0){ errlog("socket error\n"); } clientAddr.sun_family = AF_UNIX; strcpy(clientAddr.sun_path, "/tmp/socket"); iRet = connect(iClientSockfd, (struct sockaddr *)&clientAddr, addrLen); if((iRet < 0) && (errno != EINPROGRESS)){ errlog("connect error\n"); } printf("connect successfully, ready to send data*************\n"); while(1){ sendRet = write(iClientSockfd, sendBuf, BUF_SIZE); if(sendRet < 0){ errlog("write error\n"); } printf("client is waitting data from server...\n"); sleep(1); recvRet = read(iClientSockfd, recvBuf, BUF_SIZE); if(recvRet < 0){ errlog("read error\n"); }else{ printf("Unix Server Data:%s\n", recvBuf); } } close(iClientSockfd); }