socket.c (2112B)
1 /* 2 * socket.c -- low-level socket code 3 */ 4 5 #include <arpa/inet.h> 6 #include <stdio.h> 7 #include <string.h> 8 #include <sys/socket.h> 9 #include <sys/types.h> 10 #include <unistd.h> 11 12 int sock_create(const char* ip, int port) 13 { 14 int srvfd = socket(AF_INET, SOCK_STREAM, 0); 15 if (srvfd < 0) 16 { 17 perror("socket"); 18 return -1; 19 } 20 21 int opt = 1; 22 if (setsockopt(srvfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) 23 { 24 perror("setsockopt"); 25 close(srvfd); 26 return -1; 27 } 28 29 struct sockaddr_in addr; 30 memset(&addr, 0, sizeof(addr)); 31 32 addr.sin_family = AF_INET; 33 addr.sin_port = htons(port); 34 35 if (ip == NULL) 36 { 37 addr.sin_addr.s_addr = INADDR_ANY; /* accept requests from anywhere */ 38 } 39 else 40 { 41 if (inet_pton(AF_INET, ip, &addr.sin_addr) <= 0) 42 { 43 perror("inet_pton"); 44 close(srvfd); 45 return -1; 46 } 47 } 48 49 if (bind(srvfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) 50 { 51 perror("bind"); 52 close(srvfd); 53 return -1; 54 } 55 56 if (listen(srvfd, 128) < 0) 57 { 58 perror("listen"); 59 close(srvfd); 60 return -1; 61 } 62 63 return srvfd; 64 } 65 66 int sock_accept(int fd) 67 { 68 struct sockaddr_in client; 69 socklen_t len = sizeof(client); 70 71 int cfd = accept(fd, (struct sockaddr*)&client, &len); 72 if (cfd < 0) 73 { 74 perror("accept"); 75 return -1; 76 } 77 78 return cfd; 79 } 80 81 void sock_close(int fd) 82 { 83 close(fd); 84 } 85 86 int sock_connect(const char* ip, int port) 87 { 88 int fd = socket(AF_INET, SOCK_STREAM, 0); 89 if (fd < 0) 90 { 91 perror("socket"); 92 return -1; 93 } 94 95 struct sockaddr_in addr; 96 memset(&addr, 0, sizeof(addr)); 97 98 addr.sin_family = AF_INET; 99 addr.sin_port = htons(port); 100 101 if (inet_pton(AF_INET, ip, &addr.sin_addr) <= 0) 102 { 103 perror("inet_pton"); 104 close(fd); 105 return -1; 106 } 107 108 if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) 109 { 110 perror("connect"); 111 close(fd); 112 return -1; 113 } 114 115 return fd; 116 } 117 118 int sock_send(int fd, const char* data, size_t len) 119 { 120 ssize_t sent = send(fd, data, len, 0); 121 if (sent < 0) 122 { 123 perror("send"); 124 return -1; 125 } 126 127 return (int)sent; 128 } 129 130 int sock_recv(int fd, char* buf, size_t len) 131 { 132 ssize_t recvd = recv(fd, buf, len, 0); 133 if (recvd < 0) 134 { 135 perror("recv"); 136 return -1; 137 } 138 139 return (int)recvd; 140 } 141