定地?tcp、udp传输数据的时候。都需要一固定的地址:ip地址及其端口号。WinSock中,就用 SockAddr_in来指定。
struct sockaddr_in
{
short sin_family
u_short sin_port
struct in_addr sin_addr
char sin_zero[8]
}
//
in_addr 可以把字符串编程点状的ip地址
inet_addr 则相反
声明如下:
unsigned long inet_addr
{
const char* FAR* p
}
看了管道,知道了个大概,可是那么浅层次的了解。又无法解决问题。其实namedPip归根到底是提供一种简单的服务端/客户端模型来建立对某一路径的文件的操作(有byte模式和消息模式)
基本API如下,msdn有一堆解释:
首先创建一个指定名字的管道,调用如下API (具体参数查MSDN):
HANDLE CreateNamedPipe
创建一个新线程(CreateThread),轮循管道中是否有新消息到来,新线程中调用如下两个函数:
BOOL ConnectNamedPipe
BOOL DisconnectNamedPipe
//新线程过程
DWORD WINAPI InquiryPipeThreadProc(LPVOID lpParameter)
{
while(1)//堵死
{
if(TRUE!=ConnectNamedPipe(...))
{
//查询出错原因
}
ReadFile(...);
DisconnectNamedPipe(...);
PostMessage(...);//您可以将管道中收的内容发送给窗口过程的消息队列
}
return 1;
}
---上面的东西远远不足,有哪些不足呢?
首先,我们无法控制哪些人可以通过管道进行访问,哪些人需要被阻止,也就是DACL-----这也是管道的精髓。如果仅仅是普通的建立文件的读取关系的话,CreateFile不是就可以了吗?
那么如何建立DACL呢?
SECURITY_ATTRIBUTE 归根到底是初始化一个结构体去替代默认的情况
附代码:未测试
除了这点?还需要哪些改进?
效率:如果我们用namePiped中,默认的情况是实时的,我们可以采用多线程来让它可以服务多个对象
当然到现在还远远不够,最多我们仅仅了解什么是pip和构建的时候需要注意到的地方。但是对于它的实际用途还是不知道。那么pipe的实际用途是什么?
一、并不是翻译MSDN
二、管道是用来通信用的(消息队列知道不?)
三、通信的过程当然需要读取和发送,读取的内容当然是你向管道写入的内容
四、试问一下一个WEB程序想跟我们的应用程序进行通信你是如何做到的(讯雷,WEB中右键点击...)
五、Window机制看来你还不了解,其实Window把所有设备都当做文件来进行操作,主要是为了建立统一接口。
-(http://bbs.pediy.com/archive/index.php?t-63953.html)
看看第四点:这个我也不大明白。web迅雷中不是一般都要定位到某一个驱动器吗,比如E:。可是管道的话。一般都是利用UNC来进行标识的;eg: \\server\\Pipe\\
六、有一些初学者估计对socket 和socket_in有些模糊,其实socket_in里面仅仅保存要连接的具体的端口、ip信息。
而socket更多的是确定工作域、还有套用的协议。两个结合在一起绑定才是一个具体的通讯环境。
七、listent的backlog代表的是能够缓存进处理队列的连接数,但是多少个客户端发起的请求却无法明白。
八、accept(SOCKET,(SOCKETADDR)FAR*,int) accept函数中的第二个参数是连接过来的客户端的信息,
accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构sockaddr的定义请参考bind()。(FROM:http://www.embeded.cn/online/linux_function/14.html)
九、send(SOCKET,(char*)buf,int len,)