52 #define OFFSET(x) offsetof(TCPContext, x)
53 #define D AV_OPT_FLAG_DECODING_PARAM
54 #define E AV_OPT_FLAG_ENCODING_PARAM
56 {
"listen",
"Listen for incoming connections",
OFFSET(listen),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, .flags =
D|
E },
59 {
"timeout",
"set timeout (in microseconds) of socket I/O operations",
OFFSET(rw_timeout),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
60 {
"listen_timeout",
"Connection awaiting timeout (in milliseconds)",
OFFSET(listen_timeout),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
61 {
"send_buffer_size",
"Socket send buffer size (in bytes)",
OFFSET(send_buffer_size),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
62 {
"recv_buffer_size",
"Socket receive buffer size (in bytes)",
OFFSET(recv_buffer_size),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
63 {
"tcp_nodelay",
"Use TCP_NODELAY to disable nagle's algorithm",
OFFSET(tcp_nodelay),
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, .flags =
D|
E },
65 {
"tcp_mss",
"Maximum segment size for outgoing TCP packets",
OFFSET(tcp_mss),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, .flags =
D|
E },
81 if (
s->local_addr ||
s->local_port) {
82 struct addrinfo hints = { 0 }, *ai, *cur_ai;
91 "Failed to getaddrinfo local addr: %s port: %s err: %s\n",
98 ret = bind(fd, (
struct sockaddr *)cur_ai->ai_addr, (
int)cur_ai->ai_addrlen);
100 cur_ai = cur_ai->ai_next;
113 if (
s->recv_buffer_size > 0) {
114 if (setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &
s->recv_buffer_size, sizeof (
s->recv_buffer_size))) {
118 if (
s->send_buffer_size > 0) {
119 if (setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &
s->send_buffer_size, sizeof (
s->send_buffer_size))) {
123 if (
s->tcp_nodelay > 0) {
124 if (setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &
s->tcp_nodelay, sizeof (
s->tcp_nodelay))) {
129 if (
s->tcp_mss > 0) {
130 if (setsockopt (fd, IPPROTO_TCP, TCP_MAXSEG, &
s->tcp_mss, sizeof (
s->tcp_mss))) {
142 struct addrinfo hints = { 0 }, *ai, *cur_ai;
148 char hostname[1024],proto[1024],path[1024];
150 s->open_timeout = 5000000;
153 &port, path,
sizeof(path), uri);
154 if (strcmp(proto,
"tcp"))
156 if (port <= 0 || port >= 65536) {
160 p = strchr(uri,
'?');
164 s->listen = strtol(buf, &endptr, 10);
182 s->rw_timeout = strtol(buf,
NULL, 10);
185 s->listen_timeout = strtol(buf,
NULL, 10);
188 s->tcp_nodelay = strtol(buf,
NULL, 10);
191 if (
s->rw_timeout >= 0) {
193 h->rw_timeout =
s->rw_timeout;
197 snprintf(portstr,
sizeof(portstr),
"%d", port);
206 "Failed to resolve hostname %s: %s\n",
213 #if HAVE_STRUCT_SOCKADDR_IN6
215 if (cur_ai->ai_family == AF_INET6){
216 struct sockaddr_in6 * sockaddr_v6 = (
struct sockaddr_in6 *)cur_ai->ai_addr;
217 if (!sockaddr_v6->sin6_port){
218 sockaddr_v6->sin6_port = htons(port);
224 while (cur_ai && fd < 0) {
227 cur_ai->ai_protocol,
h);
230 cur_ai = cur_ai->ai_next;
238 if (
s->listen == 2) {
240 if ((
ret =
ff_listen(fd, cur_ai->ai_addr, cur_ai->ai_addrlen,
h)) < 0)
242 }
else if (
s->listen == 1) {
245 s->listen_timeout,
h)) < 0)
276 cc = (*c)->priv_data;
329 return shutdown(
s->fd, how);
349 socklen_t avail_len =
sizeof(avail);
354 if (
s->recv_buffer_size < 0) {
359 if (getsockopt(
s->fd, SOL_SOCKET, SO_RCVBUF, &avail, &avail_len)) {