goto fail;
}
+ /* Set the socket's send or receive buffer sizes, if specified.
+ If unspecified or setting fails, system default is used. */
+ if (s->recv_buffer_size > 0) {
+ setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &s->recv_buffer_size, sizeof (s->recv_buffer_size));
+ }
+ if (s->send_buffer_size > 0) {
+ setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &s->send_buffer_size, sizeof (s->send_buffer_size));
+ }
+
if (s->listen == 2) {
// multi-client
if ((ret = ff_listen(fd, cur_ai->ai_addr, cur_ai->ai_addrlen)) < 0)
h->is_streamed = 1;
s->fd = fd;
- /* Set the socket's send or receive buffer sizes, if specified.
- If unspecified or setting fails, system default is used. */
- if (s->recv_buffer_size > 0) {
- setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &s->recv_buffer_size, sizeof (s->recv_buffer_size));
- }
- if (s->send_buffer_size > 0) {
- setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &s->send_buffer_size, sizeof (s->send_buffer_size));
- }
freeaddrinfo(ai);
return 0;
return s->fd;
}
+static int tcp_get_window_size(URLContext *h)
+{
+ TCPContext *s = h->priv_data;
+ int avail;
+ int avail_len = sizeof(avail);
+
+#if HAVE_WINSOCK2_H
+ /* SO_RCVBUF with winsock only reports the actual TCP window size when
+ auto-tuning has been disabled via setting SO_RCVBUF */
+ if (s->recv_buffer_size < 0) {
+ return AVERROR(ENOSYS);
+ }
+#endif
+
+ if (getsockopt(s->fd, SOL_SOCKET, SO_RCVBUF, &avail, &avail_len)) {
+ return ff_neterrno();
+ }
+ return avail;
+}
+
const URLProtocol ff_tcp_protocol = {
.name = "tcp",
.url_open = tcp_open,
.url_write = tcp_write,
.url_close = tcp_close,
.url_get_file_handle = tcp_get_file_handle,
+ .url_get_short_seek = tcp_get_window_size,
.url_shutdown = tcp_shutdown,
.priv_data_size = sizeof(TCPContext),
.flags = URL_PROTOCOL_FLAG_NETWORK,