📄 test15.c
字号:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string.h>#include <errno.h>///////////////////////////////////////////////////////////////////////////////// definitions///////////////////////////////////////////////////////////////////////////////#define PORT 3345#define BACKLOG 5///////////////////////////////////////////////////////////////////////////////// functions///////////////////////////////////////////////////////////////////////////////int main(int argc, char **argv){ // int socket(int domain, int type, int protocol); int fd; // XXX: step 1, create socket. //if ((fd = socket(PF_INET, SOCK_RAW, 0)) < 0) //if ((fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0) if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) { fprintf(stderr, "ERROR: call socket() failed: %s\n", strerror(errno)); // FIXME: deal with this error. exit(1); }#ifdef _DEBUG_ fprintf(stdout, "DEBUG: Create socket successed, new created socket = %d\n", fd);#endif // XXX: step 2.5, reuse address & reuse port int on; on = 1; //setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) { fprintf(stderr, "ERROR: call setsockopt() failed.\n"); }#ifdef SO_REUSEPORT on = 1; if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0) { // Error! }#endif // SO_REUSEPORT // XXX: step 2.6, gethostbyname() // XXX: step 2, bind // int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen); struct sockaddr_in address; memset(&address, 0, sizeof(address)); address.sin_family = PF_INET; // XXX: bind to all interfaces. address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(PORT); if (bind(fd, (struct sockaddr *) &address, sizeof(address)) < 0) { fprintf(stderr, "ERROR: call bind() failed: %s\n", strerror(errno)); // FIXME: deal with this error. exit(1); }#ifdef _DEBUG_ fprintf(stdout, "DEBUG: call bind() successed.\n");#endif // XXX: step 3, listen // int listen(int s, int backlog); if (listen(fd, BACKLOG) < 0) { fprintf(stderr, "ERROR: call bind() failed: %s\n", strerror(errno)); // FIXME: deal with this error. exit(1); }#ifdef _DEBUG_ fprintf(stdout, "DEBUG: call listen() successed.\n");#endif for (;;) { // XXX: step 4, accept struct sockaddr_in peer_address; socklen_t peer_address_length; int new_accepted_socket; 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, "ERROR: call accept() failed: %s\n", strerror(errno)); // FIXME: deal with this error. exit(1); }#ifdef _DEBUG_ fprintf(stdout, "DEBUG: call accept() successed, new accepted socket = %d\n", new_accepted_socket); // char *inet_ntoa(struct in_addr in); fprintf(stdout, "DEBUG: new accepted from %s:%d.\n", inet_ntoa(peer_address.sin_addr), ntohs(peer_address.sin_port));;#endif } // XXX: step 5, close. close(fd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -