博文

改写你的recv和send函数(TCP传输数据细节 二)(2007-10-02 16:32:00)

摘要: TCP是基于字节流的,你向send或者recv提交一个buffer,它不一定帮你发送或者接收完这个buffer的,所以你应该自己改写一下这两个函数,以便符合应用的需要,改写后姑且命名为TCPsend,TCPrecv 下面我改写后的这两个函数的实现: ////////////////////////////////////////////////////////////////////////////////////////
int TCPsend(SOCKET s,const char*buf,int len,int flags)
{
 int n=0,sendCount=0;
 int length =len;
 if(buf==NULL)
  return 0;
 while(length>0)
 {
  n=send(s,buf+sendCount,length,flags); //发送数据,
  if(n==SOCKET_ERROR)//网络出现异常
  {
   printf("Failed send(),error code:%d\n",WSAGetLastError());
   break;
   
  }
  length-=n;
  sendCount+=n;
 }  return sendCount; // 返回已发送的字节数
} int TCPrecv(SOCKET s,char *buf,int len,int flags)
{
 
 int nRev=0,recvCount=0;
 int length =len;  if(buf==NULL)
  return 0;  // 循环接收数据
&nb......

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

WINSOCK基础知识(使用TCP通信的一些细节)(2007-03-28 22:33:00)

摘要:假设connect调用成功建立一个连接,客户端使用该连接和服务器交互。通常,应用协议指明一个请求-响应交互(request-response-interaction),即客户发送一系列的请求并等待对每个请求的响应。通常客户调用send传诵请求,调用recv等待响应。对于简单的应用协议来说,客户端只发单个请求,并接收单个响应。较复杂的应用协议要求用户反复执行,发故意个请求,然后在发送下一个请求前等待响应。下面的代码说明了这种请求响应的交互。 #define BLEN 120    /*buffer length to use*/ char *req ="request of soe sort"; char buf[BLEN];    /*buffer for answer*/ char *bptr;       /*pointer to buffer*/ int  n;            /*number of bytes read*/ int buflen;       /*space left in buffer*/   bptr = buf; buflen =BLEN; /*send  request*/ send(s,req,strlen(req),0); /*read response(may come in many pices) */ n  = recv(s,bptr,buflen,0); while(n!=SOCKET_ERROR&&n!=0) {   bptr+=n;   buflen -=n;   n  = recv(s,bptr,buflen,0); }    ......

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

WINSOCK基础知识(套接字描述符)(2007-03-28 18:57:00)

摘要:引子........
大多数的操作系统里,需要I/O请求的应用程序请求操作系统打开一个文件。系统就创建一个文件描述符提供给应用程序访问文件。从应用程序的角度看,文件描述符是一个整数,应用程序可以用它来读写文件。下图显示,操作系统如何把文件描述符实现为一个指针数组,这些指针指向内部数据结构。 对于每个程序系统都有一张单独的表。精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。当进程打开一个文件时,系统把一个指向此文件内部数据结构的指针写入文件描述符表,并把该表的索引值返回给调用者 。应用程序只需记住这个描述符,并在以后操作该文件时使用它。操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。 正题...... 套接字接口为网络通信增加了一个新的抽象,即套接字。和文件一样,每个活动的套接字都有一个整数来标识,我们将其称为套接字描述符。Windows操作系统为每个进程维护一个单独的套接字描述符表。因此,应用程序可以拥有相同的文件描述符和套接字描述符。 套接字API里有个函数socket,它就是用来创建一个套接字。套接字设计的总体思路是,单个系统调用就可以创建任何套接字,因为套接字是相当笼统的。一旦套接字创建后,应用程序还需要调用其他函数来指定具体细节。 了解套接字这个抽象概念的最简单的方法是想象一下操作系统中的数据结构。当应用程序调用socket后,操作系统分配一个新的数据结构来保存通信所需的信息,并在进程套接字描述符表内增加一个条目,存储指向这个数据结构的指针。下图显示了调用socket后的进程套接字描述符表。这里socket调用的参数指定了协议族为PF_INET,服务类型为SOCK_STREAM。 虽然套接字的内部数据结构包含很多字段,但是系统创建套接字后,大多数字字段没有填写。应用程序创建套接字后在该套接字可以使用之前,必须调用其他的过程来填充这些字段。......

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

两对话框通信实例MFC(2)(2006-12-21 18:23:00)

摘要:
//2006年12月21日作 //作者:InitInstance 在VC中要实现两个对话框的通信并不是很难的,对话框之间的通信问题归根到底就是类之间的通信问题,掌握了C++类之间的通信问题,一切均可迎刃而解。应网友的邀请我当即做了个简单的应用示范,现在这里总结一下:

过程:建立一个基于对话框类型的工程,再另外从中插入两个对话框资源模版(resource template)并为两个对话框资源模版关联两个类且都是派生于CDialog,两个类分别简单的命名为CDlg1,CDlg2,主对话框类为A,在主对话框A上有两个按钮,1:“显示对话框CDlg1”2:“显示对话框CDlg2”对话框CDlg1上又有一个按钮名为:“导出数据”,对话框CDlg2上有一个列表框控件,负责显示数据,当点击对话框CDlg1上的“导出数据”按钮时,数据立即在对话框CDlg2上显示出来了,要能实现这个过程,还得在类CDlg1中添加一个类型为CDlg2*的成员变量m_pdlg2,这样对话框CDlg1才能跟CDlg2通信,要实现CDlg2跟CDlg1通信,在CDlg2中添加CDlg1类型的一个指针变量即可,这里只是示例,我就不写了^_^。


在主对话框CExam3Dlg(我的主对话框类命名为CExam3Dlg)中,要实现通过点击按钮产生出对话框CDlg1和CDlg2,就要将类CDlg1和CDlg2的两个对象m_dlg1,m_dlg2作为主对话框CExam3Dlg的成员,现在暂时将其都设为公有的(public)。好,有了它们的两个对象就开始吧,响应“显示对话框1”和“显示对话框2”的函数分别为 void OnButton1() void OnButton2()代码如下:

//////////////////////////////////////////////////////////////////////
void CExam3Dlg::OnButton1()
{
   if(!m_dlg1.m_hWnd)
   {
    m_dlg1.Create(IDD_DIALOG1);
    m_dlg1.Sho......

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

VC6.0编译选项说明(2006-12-14 14:22:00)

摘要:此帖来自网络(仅供学习) 2006/12/14 InitInstance   Compiler   Reference  
  Home   |     Overview   |     How   Do   I  
   
  CL.EXE   is   a   32-bit   tool   that   controls   the   Microsoft   C   and   C++   compilers   and   linker.   The   compilers   produce   Common   Object   File   Format   (COFF)   object   (.OBJ)   files.   The   linker   produces   executable   (.EXE)   files   or   dynamic-link   libraries   (DLLs).  
   
  For   information   on   specifying   options,   see   Set   Compiler   Options.   Other   topics   covered   in   this   section   are   Fast   Compilation   and   CL   I......

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

两个对话框通信(MFC)的问题......(2006-08-21 01:22:00)

摘要://2006年8月20日作 //作者:InitInstance 在VC中要实现两个对话框的通信并不是很难的,对话框之间的通信问题归根到底就是类之间的通信问题,掌握了C++类之间的通信问题,一切均可迎刃而解。应网友的邀请我当即做了个简单的应用示范,现在这里总结一下:

过程:建立一个基于对话框类型的工程,再另外从中插入两个对话框资源模版(resource template)并为两个对话框资源模版关联两个类且都是派生于CDialog,两个类分别简单的命名为B1,B2,主对话框类为A,在主对话框A上有两个按钮,1:“显示对话框B1”2:“显示对话框B2”对话框B1上又有一个按钮名为:“导出数据”,对话框B2上有一个列表框控件,负责显示数据,当点击对话框B1上的“导出数据”按钮时,数据立即在对话框B2上显示出来了,要能实现这个过程,还得在类B1中添加一个类型为B2的成员变量m_b2,这样的过程也就实现了两个对话框之间通信。


在主对话框A中,要实现通过点击按钮产生出对话框B1和B2,就要将类B1和B2的两个对象m_b1,m_b2作为主对话框A的成员,现在暂时将其都设为公有的(public)。好,有了它们的两个对象就开始吧,响应“显示对话框B1”和“显示对话框B1”的函数分别为 void OnDisplayB1() void OnDisplayB2()代码如下:

//////////////////////////////////////////////////////////////////////
void CA::OnDisplayB1()
{
     if(!m_b1.m_hWnd)//如果m_b1窗口句柄为空也就是该窗口尚未存在,创建它
     {
       m_b1.Create(IDD_DIALOG1);
       m_b1.ShowWindow(SW_SHOW);
      }
  &......

阅读全文(6590) | 评论:3