?? server.c
字號:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#include <string.h>#include <errno.h>#define LISTENQ 5int main(int argc, char **argv){ int fd; if (argc < 2) { fprintf(stdout, "Usage: %s <path>\n", argv[0]); exit(1); } // XXX: step 1, socket(); //int socket(int domain, int type, int protocol); if ((fd = socket(PF_LOCAL, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "socket() failed: %s\n", strerror(errno)); exit(1); } unlink(argv[1]); // XXX: step 2, bind() (optional) struct sockaddr_un local_address; memset(&local_address, 0, sizeof(local_address)); local_address.sun_family = PF_LOCAL; memcpy(local_address.sun_path, argv[1], strlen(argv[1])); //int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); if (bind(fd, (struct sockaddr *) &local_address, sizeof(local_address)) < 0) { fprintf(stderr, "bind() failed: %s\n", strerror(errno)); // FIXME: close(fd); exit(1); } // XXX: step 3, listen(); // int listen(int s, int backlog); if (listen(fd, LISTENQ) < 0) { fprintf(stderr, "listen() failed: %s\n", strerror(errno)); // FIXME: close(fd); exit(1); } // XXX: step 4, accept(); int new_accepted_socket; struct sockaddr_un peer_address; socklen_t peer_address_length; ssize_t written; char *welcome_message = "welcome to unix domain programming."; for (;;) { peer_address_length = sizeof(peer_address); //int accept(int s, struct sockaddr *addr, socklen_t *addrlen); if ((new_accepted_socket = accept(fd, (struct sockaddr *) &peer_address, &peer_address_length)) < 0) { fprintf(stderr, "accept() failed: %s\n", strerror(errno)); // FIXME: close(fd); exit(1); } fprintf(stdout, "Accepted new connection %d from %s.\n", new_accepted_socket, peer_address.sun_path); // XXX: step 4, r/w // FIXME: maybe we should use a loop to write all data to client //ssize_t write(int fd, const void *buf, size_t count); if ((written = write(new_accepted_socket, welcome_message, strlen(welcome_message))) < 0) { fprintf(stderr, "write() failed: %s\n", strerror(errno)); // FIXME: close(new_accepted_socket); close(fd); exit(1); } else { fprintf(stdout, "written %d bytes to %d.\n", written, new_accepted_socket); } close(new_accepted_socket); } // XXX: step 5, close() close(fd); return 0;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -