VC下的TCP/IP通信(一)

来源:互联网 发布:马代满月岛 知乎 编辑:程序博客网 时间:2024/04/30 09:03

       前一段时间看了孙鑫的《VC++深入详解》,觉得非常好,现在将其中TCP通信总结一下,作为一个积累了。 客户机/服务器模式在操作过程中采取的主动请求的方式。首先服务器方要先启动,并根据请求提供相应的服务。在开始学习时,没有很好理解服务器要先启动了,致使做的第一个程序运行不成功

 

服务端程序创建程序的步骤。

1.打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。即创建socket,将使用bind函数将创建的socket与本地地址与端口绑定。

2.等待客户请求到达端口。使用liten将socket设为监听模式,从而等待客户端的请求。

3.接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一个新的进程(或线程)来处理这个客户请求。新进程(新线程)处理此客户请求,并不需要对其他请求做出响应。服务完成后,关闭此进程与客户的通信链路,并终止。使用accept函数接受到客户端的请求,并根据accept返回的socket进行与客户端通信,此时使用send/recv等函数。

4.返回第二步,等待别一个客户请求。返回第二步即等待另一个客户端的请求。

5.关闭服务器,在程序结束时,关闭本次服务的资源。

客户端程序创建的步骤:

1.打开一个通信通道,并连接到服务器所在主机的特定端口。(即创建socket)

2.向服务器发送服务请求报文,等待并接收应答;继续提出请求。( 使用conect函数)

3.请求结束后关闭通信通道。

      下面介绍几个常用的函数及类。

       在window的一些程序开发中,可以使用两种方式,一种就是借助MS提供的控件,如VB 中的winsock通信,以VC中的winsock控件。第二种是使用windows API 函数。第二种使用MFC 下的类库。本文主要介绍一些windows 函数。

 相关函数如下:

WSAStartUp函数

该函数有两个功能:一是加载套接字库,一是进行套接字库的版本协商,也就是确定将使用的socket版本。该函数原型申明为:

int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );

参数说明:

wVersionRequested : 用来指定准备加载的Winsock 库的版本号,高位字节指定所需要的winsock库的副版本,而低位字节代表winsock的主版本。如2.1,其中2就代表主版本号,而1就代表副版本号。不过window一般通过MAKEWORD(x,y)来获得wVersionRequested 的正确值。

lpWSAData:可以理解为一个返回值 ,WSAstartUp函数用其将加载的版本有关的信息都添充在这个结构中。关于空上结构体的详细信息请查阅MSDN。

在查MSDN时可能要注意下面:

Client Requires: Windows XP, Windows 2000 Professional, Windows NT Workstation,    

                            Windows Me, Windows 98, or Windows 95. Server Requires Windows  

                            Server 2003, Windows 2000 Server, or Windows NT Server.

Header Declared   in Winsock2.h.

Library Link to       Ws2_32.lib.

DLL Requires         Ws2_32.dll.

从这个可以看出该函数声明在Winsock2.h中,而当把该头文件包含在文件中时,编译时依然发生error LNK2001错误。这是因为编译器中缺少Ws2_32.lib的包含,在 project ->Settings->link里的library moulde 里添加Ws2_32.lib,在开始里时我忘了这个。

 

二 socket 函数

SOCKET socket( int af, int type, int protocol );

函数功能:调用该函数可以创建一个套接字

参数说明 :

af 是指定地址族,对于Tcp/IP协议的套接字,它只能是AF_INET,(也可以写成PF_INET).

type 是指定Socket类型,对于1.1版本的socket,它只支持两种类型的套接字,SOCK_STREAM (流式套接字),SOCK_DGRAM(数据报套接字),而在2.2版本中还增加了SOCK_RAW(自然的套接字,该套接字可以接受和发送自定义的报文头)

protcol 是与特定的地址家族相关的协议,如果指定为0时,那么系统会根据地址家族及套接字类型,自动选择一个合适的协议。常出现在以下的值: IPPROTO_IP IPPROTO_IPV6 IPPROTO_TCP IPPROTO_UDP SOL_SOCKET

原创粉丝点击