博文

第二章  socket编程原理(2007-08-21 09:52:00)

摘要:http://www.moon-soft.com/doc/5123.htm   第二章  socket编程原理
2.1  问题的引入
       UNIX系统的I/O命令集,是从Maltics和早期系统中的命令演变出来的,其模式为打开一读/写一关闭(open-write-read- close)。在一个用户进程进行I/O操作时,它首先调用“打开”获得对指定文件或设备的使用权,并返回称为文件描述符的整型数,以描述用户在打开的文件或设备上进行I/O操作的进程。然后这个用户进程多次调用“读/写”以传输数据。当所有的传输操作完成后,用户进程关闭调用,通知操作系统已经完成了对某对象的使用。        TCP/IP协议被集成到UNIX内核中时,相当于在UNIX系统引入了一种新型的I/O操作。UNIX用户进程与网络协议的交互作用比用户进程与传统的 I/O设备相互作用复杂得多。首先,进行网络操作的两个进程在不同机器上,如何建立它们之间的联系?其次,网络协议存在多种,如何建立一种通用机制以支持多种协议?这些都是网络应用编程界面所要解决的问题。        在UNIX系统中,网络应用编程界面有两类:UNIX  BSD的套接字(socket)和UNIX System V的TLI。由于Sun公司采用了支持TCP/IP的UNIX  BSD操作系统,使TCP/IP的应用有更大的发展,其网络应用编程界面──套接字(socket)在网络软件中被广泛应用,至今已引进微机操作系统 DOS和Windows系统中,成为开发网络应用软件的强有力工具,本章将要详细讨论这个问题。 2.2  套接字编程基本概念
       在开始使用套接字编程之前,首先必须建立以下概念。 2.2.1  网间进程通信
       进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的......

阅读全文(2463) | 评论:0

VC++ TCP/IP 服务/客户程序源代码(2007-08-21 09:38:00)

摘要:http://blog.csdn.net/raymondtchang/archive/2007/05/05/1597191.aspx   //TCP
//服务器端程序
#include< stdio.h >
#include< stdlib.h >
#include< windows.h >
#include< winsock.h >
#include< string.h >

#pragma comment( lib, "ws2_32.lib" )

#define PORT 2046
#define BACKLOG 10
#define TRUE 1

void main( void )
{
int iServerSock;
int iClientSock;

char *buf = "hello, world!\n";

struct sockaddr_in ServerAddr;
struct sockaddr_in ClientAddr;

int sin_size;

WSADATA WSAData;

if( WSAStartup( MAKEWORD( 1, 1 ), &WSAData ) )//初始化
{
printf( "initializationing error!\n" );
WSACleanup( );
exit( 0 );
}

if( ( iServerSock = socket( AF_INET, SOCK_STREAM, 0 ) ) == INVALID_SOCKET )
{
printf( "创建套接字失败!\n" );
WSACleanup( );
exit( 0 );
}

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons( PORT );//监视的端口号
ServerAddr.sin_addr.s_addr =......

阅读全文(7167) | 评论:0

TCP/IP网络通信程序设计(2007-08-20 17:41:00)

摘要:http://www.moon-soft.com/doc/1821.htm   TCP/IP网络通信程序设计 湖北大学数学与计算机科学学院(430062) 党德鹏 本文介绍了TCP/IP网络应用程序的面向对象设计方法,并给出了 用Visual C++4.2中MFC在Windows 95环境下开发的程序实例。 1 Sockets与Winsock 95 Winsock 95是在Unix Sockets及Windows Sockets基础上发展起 来的。Sockets原是BSD为了Unix支持互联网通信而设计的4.3BSD Uni x版本中的API,它采用客户-服务器模式的通信机制,使网络客户方和 服务器方通过Sockets实现网络之间的联接和数据交换;Win dows Soc kets描述定义了一个Microsoft Windows的网络编程界面,它为Window s TCP/IP 提供了一个BSD型套接字,除与4.3BSD Unix Sockets完全兼 容外,还包括一个扩充文件,通过一组附加的API实现Windows式(即事 件驱动)的编程风格;而Winsock 95则是在Microso ft Windows 95中 进行网络应用程序设计的接口。Windows 95在Internet支配域中的TC P /IP协议定义了Winsock 95网络编程规范,溶入了许多新特点。MFC 中提供了相应的CSock et类来实现网络通信。 2 Sockets编程原理 Sockets同时支持数据流Sockets和数据报Sockets。 下面是利用Socket进行通信连接的过程框图。其中图1是面向连 接的时序图,图2是无连接的时序图。 图1 图2 由图可以看出,客户与服务器的关系是不对称的。对于TCP C/S, 服务器首先启动,然后在某一时刻启动客户与服务器建立连接。服务 器与客户开始都必须调用socket()建立一个套接字socket,然后服务 器调用bind()将套接字与一个本地网络地址捆扎在一起,再调用liste n()使套接字处于一种被动的准备接收状态,同时规定它的请求队列长 度,之后服务器就可以调用accept()来接收客户连接。客户打开套接 ......

阅读全文(2732) | 评论:0

基于TCP/IP的局域网多用户通信(2007-08-20 17:39:00)

摘要:基于TCP/IP的局域网多用户通信
作者:华东船舶工业学院机械系 袁 渊 下载本文示例源代码

摘要:基于TCP/IP的网络通信技术实现了面向连接的用户与服务器间点对点异步通信,本文在该基础上应用了多线程以及共享数据结构技术,使网络服务器具有了多用户间数据转发的功能,进而解决了局域网多用户间的通信问题。

关键词:TCP/IP;多线程;共享;通信;网络 引言 由于因特网的迅速流行,越来越多的应用程序具备了在网上与其它程序通信的能力。从WIN95开始微软把网络功能融进了它的操作系统,使得应用程序网络通信能力更为普及。因此,微软的TCP/IP协议也就成为网络应用程序基于的首选协议。 一般采用TCP/IP协议的应用程序只实现了单用户与服务器间点对点的连接,而本文在VC6.0的环境下,运用了了多线程以及共享数据结构技术,不仅实现了多用户与服务器间的连接,而且解决了多用户间信息互发问题----依靠服务器的转发功能。通过本文的阐述,希望能对那些需要编写多用户网络通信程序的读者以启发。 一、技术概述 1.1 基于TCP/IP的通信技术 基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。下面简要地讲一下设计思路(VC6.0下): 第一部分 服务器端
  一、创建服务器套接字(create)。
  二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
  三、接受来自用户端的连接请求(accept)。
  四、开始数据传输(send/receive)。
  五、关闭套接字(closesocket)。

第二部分 用户端
  一、创建用户套接字(create)。
  二、与远程服务器进行连接(connect),如被接受则创建接收进程。
  三、开始数据传输(send/receive)。
  四、关闭套接字(closesocket)。 通过以上设计思路,我们可以创建一个简单的面向连接的单用户程序。下面,将介绍多线程技术,以使程序支持多用户。 1.2 多线程技术 我们可以把线程看成是一个进程(执行程序)中的一个执行点,每个进程在任何给定时刻可能有若干个线程在运行。一个进程中的所有线程共享该进程中......

阅读全文(2888) | 评论:1

串口API通信函数编程 (2007-08-20 11:40:00)

摘要: 16位串口应用程序中,使用的16位的Windows API通信函数:
①OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(以字节计)
CloseComm() 关闭串口;
例:int idComDev;
idComDev = OpenComm("COM1", 1024, 128);
CloseComm(idComDev);
②BuildCommDCB() 、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置; 例:DCB dcb;
BuildCommDCB("COM1:2400,n,8,1", &dcb);
SetCommState(&dcb);
③ ReadComm 、WriteComm()对串口进行读写操作,即数据的接收和发送.
例:char *m_pRecieve; int count;
ReadComm(idComDev,m_pRecieve,count);
Char wr[30]; int count2;
WriteComm(idComDev,wr,count2);
16位下的串口通信程序最大的特点就在于:串口等外部设备的操作有自己特有的API函数;而32位程序则把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作。

在MFC下的32位串口应用程序
32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API 通信函数。
使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API 通信函数的优缺点则基本上相反。

使用ActiveX控件:
VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常方便,但可惜的是,很少有介绍MSComm控件的资料。
⑴.在当前的Workspace中插入MSComm控件。
Project菜单------>Add to Project---->Components and Controls----->Registered
ActiveX Controls--->选择......

阅读全文(4948) | 评论:2

dll一些情况(2007-08-20 11:23:00)

摘要:dll class.globals #include "stdafx.h"
#include "lib.h" //#pragma data_seg("Shared")
   HANDLE handle=NULL;   //必须在定义的同时进行初始化!!!!
//#pragma data_seg()
//#pragma   comment(linker, "/section:Shared,rws"   )  
int add(int x)
{
  //CreateFile
 switch(x)
 {
 case 0:
  x=1;break;
 case 1:
  x=2;break;
 case 2:
  x=3;break;
 case 3:
  x=4;break; 
 case 4:
  x=5;break;
 default : ;  
 }
  
return x;
} bool ComOpen(int x,CString c)

 CString str; // AfxMessageBox(c);  switch(x)
 {
 case 0:
  str="COM1";break;
 case 1:
  str="COM2";break;
 case 2:
  str="COM3";break;
 case 3:
  str="COM4";break; 
 case 4:
 ......

阅读全文(2999) | 评论:0

对共享数据段技术的补充说明!(2007-08-17 16:34:00)

摘要:对共享数据段技术的补充说明! 2006-11-30 20:35 上面的那篇文章有几点没有解释清楚,所以我决定再补充两点!“细节决定成败”,也许有一个细节没弄清楚,你就不能掌握并熟练应用这个知识点和技术!! 第一点:什么是共享数据段?为什么要用共享数据段??它有什么用途??
         在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。 因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。   #pragma data_seg预处理指令用于设置共享数据段。例如: #pragma data_seg("SharedDataName") HHOOK hHook=NULL; //必须在定义的同时进行初始化!!!! #pragma data_seg() 在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataName,rws"),[注意:数据节的名称is case sensitive]那么这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。   当进程隐式或显式调用一个动态库里的函数时,系统......

阅读全文(3747) | 评论:0

VC++常用数据类型及其操作详解 (2007-08-17 14:23:00)

摘要:一.              VC常用数据类型列表 二.              常用数据类型转化 2.1数学类型变量与字符串相互转换 2.2 CString及string,char *与其他数据类型的转换和操作 ●CString,string,char*的综合比较 ●数学类型与CString相互转化 ●CString与char*相互转换举例 ●CString 与 BSTR 型转换 ●VARIANT 型转化成 CString 型 2.3 BSTR、_bstr_t与CComBSTR 2.4 VARIANT 、_variant_t 与 COleVariant 附录CString及字符串转及操作详解   参考书籍:CSDN,<<MFC深入浅出(Second Edit)>>                                  一.VC常用数据类型列表     Type Default Size Description         基 础 类 型   全 是 小 写   说明:这些基础数据类型对于MFC还是API都是被支持的 boolean unsigned 8 bit , 取值TRUE/FALSE byte unsigned 8 bit, 整数,输出按字符输出 char unsigned 8 bit, 字符 ......

阅读全文(3002) | 评论:0

Win32串口编程 ++++(2007-08-16 15:39:00)

摘要:在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。
  串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。

无论那种操作方式,一般都通过四个步骤来完成:
(1) 打开串口
(2) 配置串口
(3) 读写串口
(4) 关闭串口

(1) 打开串口

Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为:

HANDLE CreateFile( LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);

lpFileName:将要打开的串口逻辑名,如“COM1”;
dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;
dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;
lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;
dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;
dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该......

阅读全文(2818) | 评论:0

VC++ 的串口通讯(2007-08-16 14:57:00)

摘要:VC++ 的串口通讯 2007-08-09 16:41 From:http://dev.csdn.net/author/Jason009/5a65faa4258b441eab4a9d463b18f7b2.html 在VC++中有两种方法可以进行串口通讯。一种是利用Microsoft公司提供的ActiveX控件 Microsoft Communications Control。另一种是直接用VC++访问串口。下面将简述这两种方法。

  一、Microsoft Communications Control

  Microsoft公司在WINDOWS中提供了一个串口通讯控件,用它,我们可以很简单的利用串口进行通讯。在使用它之前,应将控件加在应用程序的对话框上。然后再用ClassWizard 生成相应的对象。现在我们可以使用它了。

  该控件有很多自己的属性,你可以通过它的属性窗口来设置,也可以用程序设置。我推荐用程序设置,这样更灵活。

   SetCommPort:指定使用的串口。

   GetCommPort:得到当前使用的串口。

   SetSettings:指定串口的参数。一般设为默认参数"9600,N,8,1"。这样方便与其他串口进行通讯。

   GetSettings:取得串口参数。

   SetPortOpen:打开或关闭串口,当一个程序打开串口时,另外的程序将无法使用该串口。

   GetPortOpen:取得串口状态。

   GetInBufferCount:输入缓冲区中接受到的字符数。

   SetInPutLen:一次读取输入缓冲区的字符数。设置为0时,程序将读取缓冲区的全部字符。

   GetInPut:读取输入缓冲区。

   GetOutBufferCount:输出缓冲区中待发送的字符数。

   SetOutPut:写入输出缓冲区。

  一般而言,使用上述函数和属性就可以进行串口通讯了。以下是一个范例。

#define MESSAGELENGTH 100

class C......

阅读全文(3062) | 评论:0