add more code for listener

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10895 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale
2008-12-20 15:40:33 +00:00
parent d5ef9ab196
commit ff3ccb7a3a
3 changed files with 69 additions and 9 deletions

View File

@@ -323,6 +323,59 @@ char *esl_url_decode(char *s)
}
esl_status_t esl_listen(const char *host, esl_port_t port, esl_listen_callback_t callback)
{
esl_socket_t server_sock = ESL_SOCK_INVALID;
int reuse_addr = 1;
struct sockaddr_in addr;
esl_status_t status = ESL_SUCCESS;
if ((server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
return ESL_FAIL;
}
setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
if (bind(server_sock, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
status = ESL_FAIL;
goto end;
}
if (listen(server_sock, 10000) < 0) {
status = ESL_FAIL;
goto end;
}
for (;;) {
int client_sock;
struct sockaddr_in echoClntAddr;
unsigned int clntLen;
clntLen = sizeof(echoClntAddr);
if ((client_sock = accept(server_sock, (struct sockaddr *) &echoClntAddr, &clntLen)) == ESL_SOCK_INVALID) {
status = ESL_FAIL;
goto end;
}
callback(server_sock, client_sock, echoClntAddr);
}
end:
if (server_sock != ESL_SOCK_INVALID) {
close(server_sock);
server_sock = ESL_SOCK_INVALID;
}
return status;
}
esl_status_t esl_connect(esl_handle_t *handle, const char *host, esl_port_t port, const char *password)
{

View File

@@ -256,6 +256,9 @@ char *esl_url_decode(char *s);
int esl_toupper(int c);
int esl_tolower(int c);
typedef void (*esl_listen_callback_t)(esl_socket_t server_sock, esl_socket_t client_sock, struct sockaddr_in addr);
esl_status_t esl_listen(const char *host, esl_port_t port, esl_listen_callback_t callback);
esl_status_t esl_connect(esl_handle_t *handle, const char *host, esl_port_t port, const char *password);
esl_status_t esl_disconnect(esl_handle_t *handle);