blockUntilReadable和select的问题,发生死锁...

lius1984 2008-07-08 08:46:36
无法从网络收包,调试后找到错误处在blockUntilReadable函数,socket不可读所以阻塞了程序。但socket怎样才能设为可读,同时vlc一直在收数据并显示啊。 问题在blockUntilReadable中的select()函数,这个函数无法执行,我尝试删去select但blockUntilReadable会陷入死循环。 该怎么解决这个难题,高手请指教!欢迎大家讨论,谢谢!



static int blockUntilReadable(UsageEnvironment& env,
int socket, struct timeval* timeout) {
int result = -1;
do {
fd_set rd_set;
FD_ZERO(&rd_set);
if (socket < 0) break;
FD_SET((unsigned) socket, &rd_set);
const unsigned numFds = socket+1;

result = select(numFds, &rd_set, NULL, NULL, timeout); //block here
if (timeout != NULL && result == 0) {
break; // this is OK - timeout occurred
} else if (result <= 0) {
#if defined(__WIN32__) || defined(_WIN32)
#else
if (errno == EINTR || errno == EAGAIN) continue;
#endif
socketErr(env, "select() error: ");
break;
}

if (!FD_ISSET(socket, &rd_set)) {
socketErr(env, "select() error - !FD_ISSET");
break;
}
} while (0);

return result;
}

int readSocket(UsageEnvironment& env,
int socket, unsigned char* buffer, unsigned bufferSize,
struct sockaddr_in& fromAddress,
struct timeval* timeout) {
int bytesRead = -1;

while(1)
{

int result;

result = blockUntilReadable(env, socket, timeout);
if(result > 0)
{
break;
}

if (timeout != NULL && result == 0)
{
bytesRead = 0;
break;
}

else if (timeout == NULL && result <= 0)
{
sleep(10); //break;
}

}


do {


unsigned int addressSize = sizeof fromAddress;

while(1)
{
bytesRead = recvfrom(socket, (void*)buffer, bufferSize, 0,
(struct sockaddr*)&fromAddress,
&addressSize);
if(bytesRead > 0) break; // added by lin
if(bytesRead == 0) break; // added by lin
}
....
]
return bytesRead;
}
...全文
156 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lius1984 2008-07-08
  • 打赏
  • 举报
回复
谢谢回复。

1. 怎么会没数据呢,我电脑一直在收来自服务器的数据包用vlc一直在播放。一直都是192.168.1.103:554/ch01。

我用ethereal抓包 程序运行时还是有数据的,但只有reply OK,description都没了(如下)。后附主要代码段。

2. 我注意到getResponse1中的readSocket(envir(), fInputSocketNum, &firstByte, 1, fromAddress)只有5个参数,是否应该加入timeout。 timeout的格式是怎么样的,表示什么含义呢? 还请指教!

TCP 1542 > 40504 [ACK] Seq=1 Ack=1 Win=65535 Len=0
OPTIONS rtsp://skyewe:skyewe@192.168.1.103:40504/mo01 RTSP/1.0
40504 > 1542 [ACK] Seq=1 Ack=146 Win=6432 Len=0
RTSP Reply: RTSP/1.0 200 OK



//Get the URL from streamPlayer;
char url[]= "rtsp://skyewe:skyewe@192.168.1.103:40504/mo01";

//Create the Scheduler and enviornment;
scheduler = BasicTaskScheduler::createNew();
env = BasicUsageEnvironment::createNew(*scheduler);

const char *progName = "Skyewe RTSP client";

// Create our client object:
ourClient = RTSPClient::createNew(*env, 0, progName,0);

if (NULL == ourClient)
{
shutdown1();
return 0;
};

//Send Option

m_eState = RTSP_STATE_CONNECTING;
char* optionsResponse = ourClient->sendOptionsCmd(url, NULL, NULL); //返回为空

if (m_eState==RTSP_STATE_SHUTDOWN)
{
shutdown1();
return 0;
}

m_eState = RTSP_STATE_CONNECTED;

//07-09-16 yujianchun modify, when optionresponse is null, return it
if (NULL != optionsResponse)
{
delete[] optionsResponse;
optionsResponse = NULL;
}

else
{
shutdown1();
return 0;
}


// Open the URL, to get a SDP description:
char* sdpDescription= ourClient->describeURL(url);
int statusCode = ourClient->describeStatus();

if (NULL == sdpDescription)
{
//// TRACE(L"Failed to get a SDP description from URL.\n");
shutdown1();
return 0;
}


僵哥 2008-07-08
  • 打赏
  • 举报
回复
1.没有数据,当然不可读
2.设置timeout

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧