You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
#include "client.h"
|
|
|
|
client_t* client_open(conn_handler handler) {
|
|
struct sockaddr_in servaddr;
|
|
client_t *client = malloc(sizeof(client_t));
|
|
if(NULL == handler) {
|
|
printf("client_open: received empty handler, stopping");
|
|
return NULL;
|
|
}
|
|
if (NULL == client) {
|
|
printf("client_open: malloc failed");
|
|
return NULL;
|
|
}
|
|
client->conn = connection_create(CONN_TYPE_CLIENT);
|
|
if (NULL == client->conn) {
|
|
free(client);
|
|
return NULL;
|
|
}
|
|
client->handler = handler;
|
|
client->conn->fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (-1 == client->conn->fd) {
|
|
printf("client_listen: failed to create endpoint.\n");
|
|
return NULL;
|
|
}
|
|
return client;
|
|
}
|
|
|
|
int client_connect(client_t *client, char *ip_str, int16_t port) {
|
|
struct sockaddr_in servaddr;
|
|
unsigned int servaddr_len = 0;
|
|
|
|
if(client == NULL) {
|
|
return -1;
|
|
}
|
|
|
|
servaddr.sin_family = AF_INET;
|
|
servaddr.sin_addr.s_addr = inet_addr(ip_str);
|
|
servaddr.sin_port = htons(port);
|
|
|
|
servaddr_len = sizeof(servaddr);
|
|
if(0 >= connect(client->conn->fd, (const struct sockaddr *) &servaddr, servaddr_len)) {
|
|
printf("client_accept: connection to server failed\n");
|
|
return -1;
|
|
} else {
|
|
client->handler(client->conn->fd);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int client_close(client_t *client) {
|
|
int err = 0;
|
|
if (NULL == client) {
|
|
return 0;
|
|
}
|
|
if (0 != connection_destroy(client->conn)) {
|
|
printf("client_close: closing socket failed\n");
|
|
err = -1;
|
|
}
|
|
free(client);
|
|
return err;
|
|
}
|
|
|