MSDN说的closesocket()是要使用的函数。然而,我忍不住想知道是否_close()也有效?
MSDN 似乎在 SOCKET 类型的描述中说不:(http://msdn.microsoft.com/en-us/windows/ms740516(v=vs.80)):
在 Winsock 应用程序中,套接字描述符不是文件描述符,必须与 Winsock 函数一起使用。
更具体地说,来自其关于重命名套接字函数的注释:
套接字由 Berkeley Sockets 中的标准文件描述符表示,因此该
close函数可用于关闭套接字以及常规文件。虽然 Windows Sockets 中没有任何内容可以阻止实现使用常规文件句柄来识别套接字,但也没有什么需要它。在 Windows 上,必须使用closesocket例程关闭套接字。在 Windows 上,使用该close函数关闭套接字是不正确的,并且本规范未定义这样做的效果。
然而,尽管如此,一些 Windows 文件函数在实践中可能与套接字一起工作:
鉴于ReadFileandWriteFile在套接字上工作,我怀疑_readand_write也可能与套接字以及文件句柄一起工作。
套接字句柄可以选择是 Windows Sockets 2 中的文件句柄。来自 Winsock 提供程序的套接字句柄可以与其他非 Winsock 函数(例如
ReadFile、WriteFile、ReadFileEx和 )一起使用WriteFileEx。
诸如CreateProcess之类的函数具有指向结构的指针.在CI中,它只是NULL作为可选参数的指针传递,而不是在堆栈上创建虚拟结构对象并将指针传递给虚拟对象.
在C#中,我已将其声明为(p/invoke)
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CreateProcess(
string lpApplicationName,
string lpCommandLine,
ref SECURITY_ATTRIBUTES lpProcessAttributes,
ref SECURITY_ATTRIBUTES lpThreadAttributes,
bool bInheritHandles,
CreateProcessFlags dwProcessCreationFlags,
IntPtr lpEnvironment,
string lpCurrentDirectory,
ref STARTUPINFO lpStartupInfo,
ref PROCESS_INFORMATION lpProcessInformation);
Run Code Online (Sandbox Code Playgroud)
但是,如果我试图通过null对lpProcessAttributes论点或lpThreadAttributes论据,我得到一个编译错误:
错误2参数3:无法从"<null>"转换为"ref Debugging.Wrappers.SECURITY_ATTRIBUTES"
如何修改上面的函数签名,以便我可以传递nullSECURITY_ATTRIBUTES参数,而不会出现此编译器错误?(如果我愿意,还能传递一个真正的结构?)
显然有一个 blittable 类型列表,到目前为止我没有看到 Enums 专门针对它。它们总体上是可传输的吗?还是取决于它们是否使用 blittable 基类型声明?
//e.g.
internal enum SERVERCALL : uint
{
IsHandled = 0,
Rejected = 1,
RetryLater = 2,
}
Run Code Online (Sandbox Code Playgroud)
参考文献:
我有一个带有一些矢量图形的DrawingBrush.我想将它转换为BitmapSource作为将其转换为Bitmap的中间步骤.最好的方法是什么?
我正在尝试启动并运行Windows Azure,但发现数据库方面非常令人沮丧.我需要将本地数据库从SQL 2008导出到bacpac文件,然后导入Azure.我还希望能够从Azure导出,然后导入到我的本地数据库进行调试.
我已经在网上找到了一些实现此目的的教程,但是每次我通过其中一个部分时,我最终都会找到一个部分,需要一个信息或下载标记为过时的步骤!它似乎随着时间的推移发生了很大的变化,我无法找到最新的资源
任何人都可以提供有关如何执行此操作的更新链接?
谢谢
当一个网络服务器声称ContentType:HTTP响应中的text/plain时,客户端可以假设换行符是'\n',或者'\ r \n',还是其他东西,或者它应该允许两者?
标准指定了什么?我在标准中迷茫和困惑.RFC 2046似乎定义了"普通"子类型,但是引用了RFC 822.
我已经浏览了RFC 822但是我很困惑它是否明确表示不允许CRLF(\ r \n)(在消息体中),或者是否应该隐式允许CRLF,因为任何ASCII字符在空白后都是合法的线?
RFC 5322定义了'互联网消息格式',我不确定这是否适用于HTTP(它似乎适用于电子邮件),但它具体说明你应该看到的消息体中的唯一CR或LF是CRLF组合. ?
我想为一些生成powershell脚本的代码编写单元测试,然后检查脚本是否具有有效的语法.
在没有实际执行脚本的情况下执行此操作的好方法是什么?
.NET代码解决方案是理想的,但是我可以通过启动外部进程来使用命令行解决方案.
RIO 在这里代表 Windows8 'Registered I/O'网络扩展。从示例代码来看,似乎无论您是将 RIONotify 与事件还是 IO 完成端口一起使用,您基本上最终都会编写相同的循环,并且具有几乎相同的性能特征。循环体是:
RIONotify() [event or IOCP]
Wait [on the event, or using GetQueuedCompletionStatus()]
RIODequeueCompletion()
// Process the dequeued events
Run Code Online (Sandbox Code Playgroud)
基本上,IO 完成端口的使用似乎没有提供超过“事件”通知/等待的附加功能,因为实际的消息队列是使用 RIODequeueCompletion 完成的。因此,您使用事件还是 IOCP 都没有关系。我的问题是,我是否忽略了模型之间的任何有趣或重要的区别?
如果我有一个关键部分,我必须实现一个锁定它的方法.我看到了以下变体:
while(lock)
{
//do nothing
}
lock = true;
// code of critical section
lock = false;
Run Code Online (Sandbox Code Playgroud)
但是,我对它持怀疑态度,因为从理论上讲,几个线程可以执行while(lock)(检查并看到它是假的),并且一起进入临界区,因为while(lock)并且lock = true;不是在一个连续的块中执行.我错了吗?或者这确实是一种不安全的方法?
winapi ×3
.net ×2
pinvoke ×2
sockets ×2
aslr ×1
bacpac ×1
bitmapsource ×1
c ×1
c# ×1
content-type ×1
drawingbrush ×1
enums ×1
http ×1
interop ×1
locking ×1
marshalling ×1
newline ×1
powershell ×1
security ×1
sql ×1
validation ×1
wpf ×1