问题列表 - 第20268页

当线程A关闭套接字对的末尾时,为什么windows select()并不总是通知线程B的select()?

我在Windows XP(SP3)下遇到的情况让我疯狂,而且我已经到了我的系绳的末端,所以也许有人可以提供一些灵感.

我有一个C++网络程序(非GUI).该程序用于在Windows,MacOS/X和Linux下编译和运行,因此它使用select()和非阻塞I/O作为其事件循环的基础.

除了网络功能外,该程序还需要从stdin读取文本命令,并在stdin关闭时正常退出.在Linux和MacOS/X下,这很容易 - 我只是在我的read fd_set中包含STDIN_FILENO来select(),而select()在stdin关闭时返回.我检查FD_ISSET(STDIN_FILENO,&readSet)是否为真,尝试从stdin读取一些数据,recv()返回0/EOF,所以我退出进程.

另一方面,在Windows下,您无法选择STDIN_FILE_HANDLE,因为它不是真正的套接字.您也不能对STDIN_FILE_HANDLE执行非阻塞读取.这意味着无法从主线程读取stdin,因为ReadFile()可能无限期地阻塞,导致主线程停止提供其网络功能.

没问题,我说,我只会产生一个线程来处理stdin.该线程将在无限循环中运行,在ReadFile(stdinHandle)中阻塞,并且只要ReadFile()返回数据,stdin线程就会将该数据写入TCP套接字.该套接字的另一端将由主线程选择(),因此主线程将看到通过连接进入的stdin数据,并以与其他任何操作系统相同的方式处理"stdin".如果ReadFile()返回false以指示stdin已关闭,则stdin-thread仅关闭其套接字对的结尾,以便主线程将通过select()通知,如上所述.

当然,Windows不会有一个很好的socketpair()函数,所以我不得不推出自己用听(),连接(),并接受()(如见于CreateConnectedSocketPair()函数在这里,但我做到了一般而言,它似乎有效.

问题是它不能100%工作.特别是,如果stdin在程序启动的几百毫秒内关闭,大约一半时间主线程没有得到任何关于套接字对的stdin-end已经关闭的通知.我的意思是,我可以看到(通过我的printf() - 调试)stdin线程在其套接字上调用closesocket(),我可以看到主线程是select() - 关联socket(即套接字对的另一端),但是select()永远不会返回......如果它确实返回,由于某些其他套接字选择了ready-for-whatever,FD_ISSET(main_thread_socket_for_socket_pair,&readSet)返回0,好像连接没有关闭.

在这一点上,我唯一的假设是Windows的select()实现中存在一个错误,导致主线程的select()没有注意到套接字对的另一端已被stdin-thread关闭.有另一种解释吗?(请注意,此问题已在Windows 7下报告,尽管我没有在该平台上亲自查看过它)

c windows select multithreading stdin

6
推荐指数
1
解决办法
1410
查看次数

C#/ SQL数据库监听器

我需要不断监视数据库行以检查更改(更新).如果其他来源有一些更改或更新,应该在我的应用程序上触发事件(我正在使用WCF).有没有办法连续监听数据库行以进行更改?

我可能有更多的事件来监视同一个表中的不同行.在表现方面是否有任何问题.我正在使用C#Web服务来监视SQL Server后端.

c# sql wcf erp transactions

14
推荐指数
2
解决办法
6007
查看次数

用户创建的新类?

考虑一下这种情况:我有一个水族馆模拟器,我有5种不同类型的鱼.不同的类型意味着不同的属性(速度,颜色,饥饿等).如果我希望我的模拟器的用户能够创建一种新类型的鱼并为其属性赋予其值,该怎么办?

这是如何由程序员实现的?我是否需要某种"事件处理",它会在我的"Fish"类中添加一堆特定的代码行?这甚至是一个有效的想法?

(如果它是必不可少的,那么语言就是Java.并且为了避免任何误解并阻止诸如"这是单一工作吗?"之类的评论,是的.但是我不是在寻找答案,我对这个概念感到好奇.)

编辑:是的,我的错,我没有提到交互方式:GUI.

因此,想象一个名为"添加新物种"的选项卡,其中包含鱼类的每个属性(类型,速度,颜色等)的字段.因此,用户使用适当的值填充字段,当他点击"添加"时,将调用构造函数.至少那是我的想象.:)

java user-controls types user-input dynamic

6
推荐指数
1
解决办法
142
查看次数

cocos2d框架可以在iPad上运行吗?

Cocos2d iPhone框架可以在iPad上运行吗?

我的猜测是肯定的,但是想把cocos2d的iPhone项目移植到iPad或者开始一个新项目之后检查是否有人有明确的答案.

cocos2d-iphone ipad

8
推荐指数
1
解决办法
6609
查看次数

通过const_iterator迭代std :: list

是否可以使用const_iterator迭代直到main()函数中的列表结尾?我尝试使用iter-> end()但我无法弄明白.

#include <list>
#include <string>
using std::list;
using std::string;

class list_return
{
public:
list <string>::const_iterator get_list()
{
_list.push_back("1");
_list.push_back("2");
_list.push_back("3");
return _list.begin();
 }
 private:
list <string> _list;
};

int main()  
{  
   list_return lr;

   list <string>::const_iterator iter = lr.get_list();

   //here, increment the iterator until end of list

return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator stl

1
推荐指数
1
解决办法
8079
查看次数

为什么有些语言需要在调用之前在代码中声明函数?

假设你有这个伪代码

do_something();

function do_something(){
   print "I am saying hello.";
}
Run Code Online (Sandbox Code Playgroud)

为什么有些编程语言需要调用do_something()才能显示在函数声明下面才能运行代码?

comparison scope programming-languages language-comparisons lexer

4
推荐指数
1
解决办法
127
查看次数

使用pid启动gdb

通常,我会看到pid 在后台运行的进程,并使用该命令在该进程上启动dbxdbx -a <pid>

同样我怎么能用gdb做到这一点?

c gdb process dbx

40
推荐指数
2
解决办法
5万
查看次数

有没有类似PHP的Python的ctype?无需编写扩展即可访问库?

Python有ctypes来访问库.在PHP中,您为所有内容编写扩展.像libgd这样的流行扩展几乎可以在任何地方使用.

有没有像Python的ctypes一样工作的扩展,让你可以访问库而无需编写PHP扩展?

php c shared-libraries

7
推荐指数
1
解决办法
1484
查看次数

PHP $ _FILE数组缺少提交的HTML表单中的条目

基本上,当我在一个表单中上传超过25个文件时,PHP $ _FILES数组被裁剪为前25个条目(0-24),这是不正确的.它应该全部为31.这只发生在一个特定的服务器上.Apache与PHP.我已经在其他两台服务器上尝试过,它们似乎允许所有31台服务器.

这可能是由Apache中的一些配置选项引起的吗?或者它更可能是PHP中的配置问题?

我唯一能想到的可能就是LimitRequestFields apache指令,但这应该抛出一个错误,而不是将它裁剪到前25个.对吗?

我知道在一个表单中有这么多文件字段是不好的做法,但由于此特定页面所需的功能,这是必要的.我无法解决这个问题.

任何有关此问题的帮助将不胜感激.

下面的HTML演示了我遇到的问题.

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>

<form enctype="multipart/form-data" action="test.php" method="post">
<input type="file" name="field_id_11[0][1]"/>
<input type="file" name="field_id_11[1][1]"/>
<input type="file" name="field_id_11[2][1]"/>
<input type="file" name="field_id_11[3][1]"/>
<input type="file" name="field_id_11[4][1]"/>
<input type="file" name="field_id_11[5][1]"/>

<input type="file" name="field_id_11[6][1]"/>
<input type="file" name="field_id_11[7][1]"/>
<input type="file" name="field_id_11[8][1]"/>
<input type="file" name="field_id_11[9][1]"/>
<input type="file" name="field_id_11[10][1]"/>
<input type="file" name="field_id_11[11][1]"/>
<input type="file" name="field_id_11[12][1]"/>
<input type="file" name="field_id_11[13][1]"/>
<input type="file" name="field_id_11[14][1]"/>
<input type="file" name="field_id_11[15][1]"/>
<input type="file" name="field_id_11[16][1]"/>
<input type="file" name="field_id_11[17][1]"/>
<input …
Run Code Online (Sandbox Code Playgroud)

php forms apache file-upload

5
推荐指数
1
解决办法
1620
查看次数

git-svn在过去的版本中创建分支

我知道如何使用git创建一个svn分支.但是,我可以从过去的修订/提交中做到这一点吗?

svn git

8
推荐指数
2
解决办法
1400
查看次数