111 lines
2.3 KiB
C
Executable File
111 lines
2.3 KiB
C
Executable File
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <memory.h>
|
|
//#include <pthread.h>
|
|
#include <sys/types.h>
|
|
#include <sys/socket.h>
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
|
|
#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;
|
|
}
|
|
|