全部文件下載:下載html
服務端 server.cgit
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> #include <sys/epoll.h> int main() { int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_un server_address; struct sockaddr_un client_address; //服務端移除舊socket,並建立一個socket unlink("server_socket"); server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); server_address.sun_family = AF_UNIX; strcpy(server_address.sun_path, "server_socket"); server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr *)&server_address, server_len); listen(server_sockfd, 5); while(1) { char ch; printf("server: server waiting....\n"); int epfd; epfd = epoll_create(1); struct epoll_event ev,events[5]; ev.data.fd = server_sockfd; ev.events = EPOLLIN|EPOLLET; epoll_ctl(epfd, EPOLL_CTL_ADD,server_sockfd, &ev); //註冊epoll事件 printf("server: epoll_wait....\n"); int epoll_re = epoll_wait(epfd,events,1,-1); //永遠阻塞等待事件發生 printf("server: epoll_re=%d\n",epoll_re); int i; for(i = 0; i < epoll_re; i++) { if(events[i].data.fd == server_sockfd) //接受鏈接 client_len = sizeof(client_address); client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len); //讀寫數據 read(client_sockfd, &ch, 1); printf("server: from client get a char = %c\n", ch); printf("server: write to client a char = %c\n", ch++); write(client_sockfd, &ch, 1); close(client_sockfd); } } }
客戶端 client.cbash
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <sys/un.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char *argv[]) { int sockfd; int len; struct sockaddr_un address; int result; char ch = 'A'; if( argc == 2) ch = *argv[1]; //建立一個socket sockfd = socket(AF_UNIX, SOCK_STREAM, 0); address.sun_family = AF_UNIX; strcpy(address.sun_path, "server_socket"); len = sizeof(address); result = connect(sockfd, (struct sockaddr *)&address, len); if(result == -1) { perror("oops: client1"); exit(1); } //讀寫數據 write(sockfd, &ch, 1); printf("client: write to server a char = %c\n", ch); read(sockfd, &ch, 1); printf("client: from server get a char = %c\n", ch); close(sockfd); exit(0); }
Makefile:socket
CLIENTS=client SERVERS=server CFLAGS=-g LDFLAGS=-g ALL= $(CLIENTS) $(SERVERS) all: $(ALL) clean: @rm -f $(ALL) *~ *.o
測試:oop
[sunbeau@localhost test]$ ll total 12 -rw-rw-r--. 1 sunbeau sunbeau 840 Oct 9 17:25 client.c -rw-rw-r--. 1 sunbeau sunbeau 123 Oct 9 17:25 Makefile -rw-rw-r--. 1 sunbeau sunbeau 1693 Oct 9 17:25 server.c [sunbeau@localhost test]$ make cc -g -g client.c -o client cc -g -g server.c -o server [sunbeau@localhost test]$ ./server & [13] 11727 [sunbeau@localhost test]$ server: server waiting.... server: epoll_wait.... [sunbeau@localhost test]$ ./client server: epoll_re=1 server: from client get a char = A server: write to client a char = A client: write to server a char = A server: server waiting.... server: epoll_wait.... client: from server get a char = B [sunbeau@localhost test]$ ./client B server: epoll_re=1 client: write to server a char = B server: from client get a char = B server: write to client a char = B server: server waiting.... server: epoll_wait.... client: from server get a char = C [sunbeau@localhost test]$
參考:測試
https://www.cnblogs.com/lojunren/p/3856290.html.net
https://www.cnblogs.com/ypwen/p/4725532.htmlcode
https://blog.csdn.net/ljx0305/article/details/4065058server