由于各种原因,我想在读取和写入服务器中的套接字时实现超时但无法使其运行,因此请求了解问题可能存在的地方.
为了设置读取和写入套接字的超时,我正在尝试使用函数setsocketopt()和getsocketopt().但是我必须做错了,因为返回值表明发生了问题并且perror输出"Invalid argument".奇怪的是错误并不总是发生在第一次使用setsocketopt()和getsocketopt(),这令我费解位.
以下服务器和客户端代码重现我的问题(使用gcc编译)
服务器代码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
struct sockaddr_in saddr,caddr;
socklen_t clen;
int sock, csock, reuse = 1, ret=0;
socklen_t ntrcv, ntsnd;
struct timeval tout, tsnd, trcv;
// create a new stream socket
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) perror("failed to create socket");
else {
// enable the socket to reuse the address
if (setsockopt(sock, …Run Code Online (Sandbox Code Playgroud) 我试图理解一个多播代码,我不明白一小部分的实用程序:
int fd_socket = socket(AF_INET, SOCK_DGRAM, 0);
u_int yes = 1;
setsockopt(fd_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
Run Code Online (Sandbox Code Playgroud)
我不明白该setsockopt功能的实用程序.我知道这个函数允许修改内核中的套接字,SOL_SOCKET因为我的修改是关于套接字的级别而不是协议级别.我不明白SO_REUSEADDR.
是否可以使用Linux 中C++ 代码中的setsockopt调用来更改TCP 拥塞控制算法,Cubic反之亦然?
我正在寻找这样做的示例代码。Reno
如果我这样尝试:
my $sock = IO::Socket::INET->new( … ) or die "no socket for you";
defined $sock->setsockopt(SOL_SOCKET, SO_RCVTIMEO, 30) or die "setsockopt: $!";
Run Code Online (Sandbox Code Playgroud)
然后我的脚本因“setsockopt:[第 2 行] 处的无效参数”而死亡。在IO::Socket和perlfunc豆荚不说,虽然perlfunc给出了一个例子TCP_NODELAY,这使它看起来像上面应该工作。
(快速说明:我已经尽我所能回答了我自己的问题,但当然欢迎更好的答案。最明显的“更好”是它具有便携性,至少在 POSIX 机器上)