📄 rtsp_comm.c
字号:
/*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is MPEG4IP.
*
* The Initial Developer of the Original Code is Cisco Systems Inc.
* Portions created by Cisco Systems Inc. are
* Copyright (C) Cisco Systems Inc. 2000, 2001. All Rights Reserved.
*
* Contributor(s):
* Bill May wmay@cisco.com
*/
/*
* rtsp_comm.c - contains communication routines.
*/
//#include "stddefs.h"
/*#if ((defined ST_7109 || defined ST_7100 )&& defined ST_OSLINUX)
#include "compat.h"
#endif*/
#include "rtsp_private.h"
#ifdef HAVE_POLL
//#include <sys/poll.h>
#endif
/*#if ! ((defined ST_7109 || defined ST_7100 )&& defined ST_OSLINUX)
#include "ngnetdb.h"
#endif*/
/*
* rtsp_create_socket()
* creates and connects socket to server. Requires rtsp_info_t fields
* port, server_addr, server_name be set.
* returns 0 for success, -1 for failure
*/
static int rtsp_get_server_address (rtsp_client_t *info)
{
#ifdef HAVE_IPv6
#else
int error;
struct hostent *host;
if (inet_aton(info->server_name, &info->server_addr) != 0) return 0;
host = (struct hostent *)gethostbyname(info->server_name);
if (host == NULL) {
Rtsp_Printf( "Can't get server host name %s\n", info->server_name);
return (error);
}
info->server_addr = *(struct in_addr *)host->h_addr;
#endif
return 0;
}
int rtsp_create_socket (rtsp_client_t *info)
{
#ifndef HAVE_IPv6
struct sockaddr_in sockaddr;
#endif
int result;
/* Do we have a socket already - if so, go ahead*/
if ((info->server_socket) != -1)
{
return (0);
}
if (info->server_name == NULL)
{
Rtsp_Printf( "No server name in create socket\n");
return (-1);
}
result = rtsp_get_server_address(info);
if (result != 0)
{
Rtsp_Printf("rtsp_get_server_address error.\n");
return -1;
}
//#ifndef _WIN32
//#ifdef HAVE_IPv6
/* info->server_socket = socket(info->addr_info->ai_family,
info->addr_info->ai_socktype,
info->addr_info->ai_protocol);
*/
//#else
info->server_socket = socket(AF_INET, SOCK_STREAM, 0);
//#endif
/*#else
info->server_socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, 0);
Rtsp_Printf("come to WSASocket..\n")
#endif*/
if (info->server_socket == -1) {
Rtsp_Printf( "Couldn't create socket\n");
return (-1);
}
#ifndef HAVE_IPv6
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(info->port);
//sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockaddr.sin_addr = info->server_addr;
#endif
#ifndef _WIN32
result = connect(info->server_socket,
(void *)&sockaddr,
sizeof(sockaddr)
);
if (result < 0)
#else
result = WSAConnect(info->server_socket,
(struct sockaddr *)&sockaddr,
sizeof(sockaddr),
NULL,
NULL,
NULL,
NULL);
if (result != 0)
#endif
{
Rtsp_Printf( "Couldn't connect socket - error111111 %s\n", strerror(result));
return (-1);
}
/* if (info->thread != NULL) {
#ifndef _WIN32
result = fcntl(info->server_socket, F_GETFL);
result = fcntl(info->server_socket, F_SETFL, result | O_NONBLOCK);
if (result < 0) {
Rtsp_Printf( "Couldn't create nonblocking %s",
strerror(errno)
);
}
#else
rtsp_thread_set_nonblocking(info);
#endif
}*/
return (0);
}
/*
* rtsp_send()
* Sends a buffer over connected socket. If socket isn't connected,
* tries that first.
* Buffer must be formatted to RTSP spec.
* Inputs:
* info - pointer to rtsp_client_ for client session
* buff - pointer to buffer
* len - length of buffer
* Outputs:
* 0 - success, -1 failure
*/
int rtsp_send2 (rtsp_client_t *info, const char *buff, uint32_t len)
{
int ret;
if (info->server_socket == -1) {
if (rtsp_create_socket(info) != 0)
return (-1);
}
ret = send(info->server_socket, (void*)buff, len, 0);
return (ret);
}
/*
* rtsp_receive()
* Receives a response from server with a timeout. If recv returns a
* full buffer, and the last character is not \r or \n, will make a
* bigger buffer and try to receive.
*
* Will set fields in rtsp_client_. Relevent fields are:
* recv_buff - pointer to receive buffer (malloc'ed so we can always add
* \0 at end).
* recv_buff_len - max size of receive buffer.
* recv_buff_used - number of bytes received.
* recv_buff_parsed - used by above routine in case we got more than
* 1 response at a time.
*/
int rtsp_receive_socket (rtsp_client_t *info, char *buffer, uint32_t len,
uint32_t msec_timeout, int wait)
{
int ret;
/*rtsp_debug(LOG_DEBUG, "Calling recv");*/
#ifndef _WIN32
ret = recv(info->server_socket, buffer, len, 0);
#else
#endif
return (ret);
}
/*
* rtsp_close_socket
* closes the socket. Duh.
*/
void rtsp_close_socket (rtsp_client_t *info)
{
if (info->server_socket != -1)
closesocket(info->server_socket);
info->server_socket = -1;
#ifdef HAVE_ST_ADDRINFO
CHECK_AND_FREE(info->addr_info,__LINE__,__FILE__);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -