00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <unistd.h>
00019 #include <errno.h>
00020 #include <netinet/in.h>
00021 #include <sys/socket.h>
00022
00023 #include "addr.h"
00024 #include "str.h"
00025 #include "tcp.h"
00026
00027 int tcp_listen(const char *ip, int port, int backlog)
00028 {
00029 int fd;
00030 struct sockaddr_in inaddr;
00031
00032 if (port < 1)
00033 return errno = EINVAL, -1;
00034
00035 str_zero(&inaddr, sizeof(inaddr));
00036 inaddr.sin_family = AF_INET;
00037 inaddr.sin_port = htons(port);
00038
00039 if (addr_from_str(ip, &inaddr.sin_addr.s_addr, 0) == 0)
00040 return errno = EINVAL, -1;
00041
00042 if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
00043 return -1;
00044
00045 if (bind(fd, (struct sockaddr *) &inaddr, sizeof(struct sockaddr_in)) == -1) {
00046 close(fd);
00047 return -1;
00048 }
00049
00050 if (listen(fd, backlog) == -1) {
00051 close(fd);
00052 return -1;
00053 }
00054
00055 return fd;
00056 }