"网络编程"学习笔记(3)

原创 2004年08月22日 01:20:00

学习笔记(3):
Interprocess Communication(单向间通讯):MailSlot(邮槽):
邮槽的命名规则:
//ServerName/MailSlot/[path]name
第一部分/ / s e r v e r对应于服务器的名字,我们要在上面创建邮槽,并在在上面运行服务器程序。第二部分/ M a i l s l o t是一个"硬编码"的固定字串,用于告诉系统这个文件名从属于M S F S。而第三部分/ [ p a t h ] n a m e则允许应用程序独一无二地定义及标识一个邮槽名。其中,"p a t h"代表路径,可指定多级目录。
举个例子(注意M a i l s l o t不得变化,亦即所谓的"硬编码"):
//Oreo/Mailslot/Mymailslot
//Testserver/Mailslot/Cooldirectory/Funtest/Aothermailslot
//./Mailslot/Easymailslot
//*/Mailslot/Myslot
服务器字串部分可表示成一个小数点( .)、一个星号(*)、一个域名或者一个真正的服务
器名字。
疑问:由于邮槽要依赖Windows文件系统服务在网上来创建和传输数据,所以接口是"与协议无关"的。那windows文件系统服务又是怎么样那实现的呢?
无连接:就是到服务器的数据包发出后,不要求client端有一个收到数据的确认。
错误反应:所有Win32 API函数(C r e a t e F i l e和C r e a t e M a i l s l o t除外)在调用失败的情况下,都会返回0值。C r e a t e F i l e和C r e a t e M a i l s l o t这两个A P I却会返回I N VA L I D _ H A N D L E _ VA L U E(无效句柄值)
但是我们不能在远程创建mailslot的?"//*"这样的形式又是为什么会这样的呢?
CreateMailslot:
HANDLE CreateMailslot(
  LPCTSTR lpName,         // pointer to string for mailslot name
  DWORD nMaxMessageSize,  // maximum message size
DWORD lReadTimeout,     // milliseconds before read time-out
  LPSECURITY_ATTRIBUTES lpSecurityAttributes
                          // pointer to security structure
);
lpName:的格式如下表。
nMaxMessageSize:指示消息的长度,若长度小了服务器不与理睬,若设为0表示任何长度。
IreadTimeout:具体的永久等待还是不等待。
lpSecurithAttributes:安全的问题。
//./mailslot/name Retrieves a client handle to a local mailslot.
//computername/mailslot/name Retrieves a client handle to a remote mailslot.
//domainname/mailslot/name Retrieves a client handle to all mailslots with the specified name in the specified domain.
//*/mailslot/name Retrieves a client handle to all mailslots with the specified name in the system's primary domain.
一个简单的例子:
client:
// Module Name: Client.cpp
//
// Purpose:
//     To demonstrate how to write a mailslot client application
//
// Compile:
//     cl -o Client Client.cpp
//
// Command Line Parameters/Options:
//     - Specifies what mailslot server to send data
//                     to
//dos:
// c:>/client

//
#include
#include
//
//必需在dos环境下调试,调试的语法结构为 : 如,c:>/Client

//这个是将hongweijing 发给服务器,当然前提是服务器是打开的。
//
void main(int argc, char *argv[])
{
 HANDLE Mailslot;   //定义一个邮槽
 DWORD BytesWritten;  //指向想要发送的最大字符数量,是ReadFile的第三个参数
 CHAR ServerName[256] ; //服务器名字(一般在调试的时候认为是机器名)

 // Accept a command line argument for the server to send
 // a message to
 if (argc < 2)
 {
  printf("Usage: client /n");
  return;
 }
 //
 //sprintf():将ServerName = // arg[1]/Mailslot/Myslot
 //
 sprintf(ServerName, "
////%s//Mailslot//Myslot", argv[1]);

 if ((Mailslot = CreateFile(ServerName, GENERIC_WRITE,
  FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
  NULL)) == INVALID_HANDLE_VALUE)
//必须注意OPEN_EXISTRING的存在的必要
// INVALID_HANDLE_VALUE :  (HANDLE)-1
 {
  printf("CreateFile failed with error %d/n", GetLastError());
  return;
 }

 if (WriteFile(Mailslot, "This is a test", 14, &BytesWritten,
  NULL) == 0)
 {
  printf("WriteFile failed with error %d/n", GetLastError());
  return;
 }

 printf("Wrote %d bytes/n", BytesWritten);

 CloseHandle(Mailslot); //最后我们需要关闭邮槽
}

Server:
// Module Name: Server1.cpp
//
// Purpose:
//     Demonstrates how to write a mailslot server application
//
// Compile:
//     cl -o Server1 Server1.cpp
//
// Command Line Options:
//     None
//

#include
#include

void main(void)
{
 HANDLE Mailslot;   //定义一个邮槽
 char buffer[256];    //发送过来的消息
 DWORD NumberOfBytesRead; //指定的字节数

 // Create the mailslot
 if ((Mailslot = CreateMailslot("
////.//Mailslot//Myslot", 0,
  MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)
 {
  printf("Failed to create a mailslot %d/n", GetLastError());
  return;
 }

 // Read data from the mailslot forever!
 // If the function succeeds, the return value is nonzero.
 while(ReadFile(Mailslot, buffer, 256, &NumberOfBytesRead,
  NULL) != 0)
 {
  buffer[NumberOfBytesRead] = 0;  //当读入成功的时候对suffer缓存进行修改
  printf("%s/n", buffer);
 }
}

其他的API函数……

Unix网络编程读书笔记(一)

之前终于把unix环境高级编程这本书过了一遍,其中介绍的内容不少,有些内容一下子还接受不了。算了,就先这样吧,以后用到的时候再详细研究吧。 今天开始看看Unix网络编程这本书。还是在看书的同时写写读书...
  • u012927281
  • u012927281
  • 2016年08月18日 22:24
  • 441

0-Linux 网络编程学习笔记导航

学习交流群: Linux 学习交流群 610441700 说明:本系列文章并不能取代 《UNP》这本旷世之作,文章中难免有错误与不足之处,希望读者们遇到有疑问的地方可以加群互相交流,共...
  • q1007729991
  • q1007729991
  • 2017年04月04日 17:09
  • 5123

Unix网络编程学习笔记

声明 本笔记尽量不涉及SCTP、IPv6以及Unix平台特定的相关知识等.便于学习Winsock的读者阅读. 第一章 简介  说明:相关内容请阅读本博客关于计算机网络的笔记http://t....
  • Study_2011
  • Study_2011
  • 2013年10月01日 08:50
  • 1621

网络编程学习笔记一

本学期开始学习网络编程,第一个任务是学时TCP/IP客户端服务器的搭建 用C写服务器端(Server.cpp) #pragma comment(lib, "ws2_32.lib")//预编译 #inc...
  • letianxf
  • letianxf
  • 2017年02月22日 21:28
  • 299

《UNIX网络编程 卷2》读书笔记(二)

      如何知道进程在一个空消息队列中放入一个消息?如果阻塞在msgrcv调用中,则除了等待无法做其他事情,如果给msgrcv指定非阻塞标志(IPC_NOWAIT),尽管不阻塞了,但必须持续调...
  • phinecos
  • phinecos
  • 2008年05月27日 16:50
  • 490

Unix网络编程读书笔记(五)

使用UDP编写的一些常见的应用程序有:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络关系协议)。 UDP协议的通信函数分别是sendto与recvfrom函数,函数原型如下: #inc...
  • u012927281
  • u012927281
  • 2016年09月01日 21:54
  • 290

0-linux 编程学习笔记导航

学习交流群: Linux 环境编程 610441700 说明:本系列文章并不能取代 《APUE》这本旷世之作,文章中难免有错误与不足之处,希望读者们遇到有疑问的地方可以加群互相交...
  • q1007729991
  • q1007729991
  • 2016年10月09日 20:26
  • 6921

php 编程笔记分享 - 非常实用

php strstr 判断一个字符串是否存在于里一个字符串中 php stristr() 函数查找字符串在另一字符串中的第一次出现 php strchr() 函数查找字符串在另一字符串中的第一次出现 ...
  • wuxiaopeng_1986
  • wuxiaopeng_1986
  • 2016年05月27日 22:37
  • 600

《Unix网络编程》卷1:套接字联网API(第3版):基本TCP编程、TCP客户端/服务器程序、I/O复用

全书共31章+附录。 计划安排:吃透这本书,一天三章+源码,并实测代码做当天笔记,CSDN见。 时间安排:计划时间1.5个月 == 6个周末 == 12天。 2017.08.05    第01-03...
  • sinat_36184075
  • sinat_36184075
  • 2017年08月06日 21:39
  • 504

TCP-IP学习笔记二:NIO的网络编程Buffer简单使用

TCP/IP学习笔记二:NIO的网络编程Buffer简单使用标签(空格分隔):网络编程 NIO BufferNIO的有三种模型:ByteBuffer (position/limit/capacity)...
  • MOTUI
  • MOTUI
  • 2016年10月11日 21:35
  • 542
收藏助手
不良信息举报
您举报文章:"网络编程"学习笔记(3)
举报原因:
原因补充:

(最多只允许输入30个字)