#include #include #include #include //#include #include #include #include #include #include "tcp.h" struct sockaddr_in init_sockaddr_in(int port) { struct sockaddr_in r; r.sin_family = AF_INET; r.sin_addr.s_addr = INADDR_ANY; r.sin_port = htons(port); return r; } struct sockaddr *hostent2sockaddr(struct hostent *e, int port) { static struct sockaddr_in sa; sa.sin_family = AF_INET; sa.sin_port = htons(port); memcpy(&sa.sin_addr.s_addr, e->h_addr, e->h_length); return (struct sockaddr*)&sa; } void my_setsockopt(int socket, int option, int value) { setsockopt(socket, SOL_SOCKET, option, &value, sizeof(value)); } socket_fd_t tcp_connect(const char *server_name, int port) { socket_fd_t comm_socket; struct sockaddr *serv_addr = NULL; struct hostent *server = NULL; if ((comm_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("connect (socket)"); return ERR_CANT_CREATE_SOCKET; } if ((server = gethostbyname(server_name)) == NULL) { perror("connect (gethostbyname)"); return ERR_INVALID_HOST; } printf("%s \n", *server); serv_addr = hostent2sockaddr(server, port); if (connect(comm_socket, serv_addr, sizeof(*serv_addr)) < 0) { perror("connect (connect)"); return ERR_CANT_CONNECT; } return comm_socket; } socket_fd_t tcp_accept(int port) { socket_fd_t accept_socket, comm_socket; socklen_t addrlen = sizeof(struct sockaddr_in); struct sockaddr_in serv_addr = init_sockaddr_in(port); struct sockaddr_in cli_addr = init_sockaddr_in(0); if ((accept_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("accept (socket)"); return ERR_CANT_CREATE_SOCKET; } my_setsockopt(accept_socket, SO_REUSEADDR, 1); if (bind(accept_socket, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { perror("accept (bind)"); close(accept_socket); return ERR_CANT_BIND_SOCKET; } if (listen(accept_socket, 255) < 0) { perror("accept (listen)"); close(accept_socket); return ERR_CANT_LISTEN; } if ((comm_socket = accept(accept_socket, (struct sockaddr *)&cli_addr, &addrlen)) < 0) { perror("accept (accept)"); return ERR_CANT_ACCEPT; } close(accept_socket); return comm_socket; }