s-httpd

mildly suckless httpd
Log | Files | Refs | README | LICENSE

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