- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我实现了一个套接字客户端,通过 HTTP 与带有 RTSP 的网络摄像头通信,以从摄像头获取视频。
要与相机建立通信,首先我必须设置一个 HTTP-GET 隧道,然后发送 RTSP 命令。当相机失去连接时,程序必须关闭隧道处理程序,完成线程,当进程返回到主函数时,它开始通信(启动线程等)。
关于重新连接:http-get 隧道设置正常,我的意思是套接字连接并收到“HTTP OK”,因此程序发送 RTSP“DESCRIBE”,但 recv 始终返回 EAGAIN 错误。我用 wireshar 检查相机发送了 DESCRIBE OK 响应,但 recv 从未收到它。
代码如下:
struct sockaddr_in aServer;
// string myData;
char *myData=new char [256];
connection *c=(connection*)vargp;
memset(&aServer, 0, sizeof aServer);
aServer.sin_family = AF_INET;
aServer.sin_addr.s_addr = inet_addr(c->theServer.c_str());
if (aServer.sin_addr.s_addr == INADDR_NONE)
{
struct hostent *hp;
hp = gethostbyname(c->theServer.c_str());
if (hp != NULL)
{
memcpy(&aServer.sin_addr, hp->h_addr, hp->h_length);
aServer.sin_family = hp->h_addrtype; //Protocol family
}
else
cout << "Failed to resolve " << c->theServer.c_str() << ": " << hstrerror(h_errno) << endl;
}
aServer.sin_port = htons(c->thePort);
c->fd_get = socket(AF_INET, SOCK_STREAM, 0);
struct timeval timeout;
timeout.tv_sec = 5;
timeout.tv_usec = 0;
setsockopt(c->fd_get, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
if (c->fd_get < 0){
cout << "fd_get < 0" << endl;
c->bFin=true;
c->WakeUP();
}
if (connect(c->fd_get, (struct sockaddr *) &aServer, sizeof aServer) < 0){
cout << "connect fd_get < 0" << endl;
c->bFin=true;
c->WakeUP();
}
if(!c->bFin){
sprintf(myData, "GET %s HTTP/1.1\r\n", c->theURI.c_str());
sprintf(myData, "%sx-sessioncookie: %s\r\nAccept: application/x-rtsp-tunnelled\r\nAuthorization: %s\r\n\r\n", myData,c->theHTTPSessionId.c_str(), c->addAuthorization(c->aGlobalUsername, c->aGlobalPassword).c_str() );
cout << myData << endl;
write(c->fd_get, myData, strlen(myData));
//LISTENING...
int theLen=1500; //3000;
int ret=0;
unsigned char datosRecibidos[3000];
int flags =fctl(c->fd_get, F_GETFD;
if((flags & O_NONBLOCK) == O_NONBLOCK){
fprint(stderr, "yup, its nonblocking");
}
else{
fprint(stderr, "nope, its blocking");
}
while (c->bFin==false){
ret = read(c->fd_get, ReceivedData, theLen);
// ret= recvfrom(c->fd_get, ReceivedData, theLen, 0, (struct sockaddr *) 0, (socklen_t*)0);
if (ret == 0)
{
cout << "Server closed connection: 0" << endl;
}
else
if (ret == -1){
fprintf (stderr, "\n[%d]: %s %d\n", __LINE__, strerror (errno), errno);
if(errno==107 ||errno==EAGAIN){
cout << "errno" << endl;
c->bFin=true;
c->WakeUP();
cout << "vuelta wakeUP" << endl;
break;// empezar de nuevo
}else{
cout << "errno" << endl;
}
}
else{
//cout << (string)ReceivedData[0]<< endl;
c->ProcessReceivedData(ReceivedData, ret);
usleep(10);
}
}
close(c->fd_get);
c->fd_get = -1;
}
会不会是超时问题?还是堆栈问题?我该如何解决?
在此先感谢您的帮助。最好的问候。
克里斯蒂娜
最佳答案
EAGAIN 表示在非阻塞套接字上没有可供读取的数据。因此,您应该再次运行 recv 调用。
您实际上没有发布足够的代码来表明存在编程错误,但我可以问一下,当您检测到连接已关闭时,您是否也关闭了您的终端,然后再重新建立一切?
关于c++ - EAGAIN 上 recv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4777721/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
美好的一天, 我正在用 VC++ 开发一个应用程序,它使用 UDP 协议(protocol)与 Windows XP 上的 winsock 进行通信。以前我已经能够假设该工具接收到的所有数据包都来自一
所以我需要从服务器向客户端接收一个 html 文件,该文件比缓冲区大所以我发送了几次。这就是为什么我在接收时有这个循环 while (i = recv(s, buf, TAM_BUFFER, 0))
我有几个关于 C 中的套接字库的问题。这是我将在问题中引用的代码片段。 char recv_buffer[3000]; recv(socket, recv_buffer, 3000, 0); 我如何决
当我的代码处于阻塞的 recv 调用中时,如果另一端重新启动,那么这一端的 recv 调用不会知道它,只会进入挂起状态。 如何避免这种情况? 最佳答案 默认情况下,如果连接的另一端在没有正确终止连接的
我有一个在平台上运行的 TCP 服务器,它从缓冲区读取字节并在一个发送调用中通过网络发送所有字节: send(sSocket.client_sock, base, frb_size, 0); frb_
假设以下代码(为了简单起见,我在这里省略了必要的错误处理): recv(sockfd, NULL, 0, MSG_PEEK); recv(sockfd, buff, bufflen, 0); 在那种情
我想用 ansible 安装 facebook osquery。 ubuntu的使用说明如下: sudo apt-key adv --keyserver keyserver.ubuntu.com --
我遇到了 recv() 和 send() winsock api 的问题。 Recv() 在接收最后一个数据包时挂起。 问题描述:- 系统 A 的应用正在通过非阻塞套接字写入数据,而系统 B 的应用正
我正在构建一个 TCP 应用程序,它使用换行符 \n 来分隔未知长度(但通常小于 64 字节)的消息。我正在寻找 this article非常有用。 是一次recv一个字符并检查它是否为换行符或r
我使用 epoll 实现 TCP 套接字通信来监视所有客户端事件,只有一个线程在一个 for 循环中处理所有客户端。每个套接字都是非阻塞的。 现在我遇到了一个问题,当客户端发送的数据超过MTU时,意味
在python中,方法是: socket.recv(bufsize[, flags]) 在C中,方法是: int recv( _In_ SOCKET s, _Out_ char *buf, _In_
如果我有一个套接字 s 会发生什么,它上面当前没有可用数据,它是一个阻塞套接字,我从两个套接字上调用 recv线程一次?其中一个线程会获取数据吗?双方都会得到吗?第二次调用 recv 会返回错误吗?
我有一个非常烦人的问题,我在其他论坛上发现了几次,但是找不到合适的解决方案。 问题是recv()在连接的最后几个字节上返回0。以下是一些背景信息。 两种(客户端/服务器)应用程序都在同一台计算机上运行
我正在使用 C 语言在 Unix 上编写客户端/服务器程序,使用发送/接收。我偶尔会从 recv 调用中遇到段错误。该行为不能完全重现;有时它会发生,有时程序会运行到完成。 知道这意味着什么吗? 最佳
我想 mock 套接字的recv函数并遇到麻烦。即使我没有必要,也要获取实际上连接套接字所需的错误。 这是所有相关代码: Class A: def __init__.py(self):
我已经编写了一个服务器-客户端程序,我想问一问:32位和64位操作系统之间recv()函数的行为是否有所不同。 我之所以这样问是因为我在64位笔记本电脑上同时运行服务器和客户端,并且一切正常。我这样调
我有许多设备需要从中获取状态更新。我只需要一个套接字对象,而我只需要 socket.recv() 来获取状态。放入单线程应用程序,不会出现问题: class Device: def recei
在 C 中,我希望读取页面的 html,但我希望保存数据的缓冲区是动态的。我知道我必须通过循环和使用 realloc 来执行此操作但我不太确定我将如何去做。假设我的套接字( sock )已经打开,请考
这个循环应该逐行从套接字中获取数据并将其放入缓冲区。出于某种原因,当没有新数据返回时, recv 返回它得到的最后几行。我能够通过注释掉第一个 recv 来阻止这个错误,但是我不知道下一行会有多长时间
我是一名优秀的程序员,十分优秀!