heis/TCP/tcp.c

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;
}