参考:http://tech.163.com/school
http://tb.donews.net/TrackBack.aspx?PostId=101035
在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面三个文件,否则会出现编译错误。
1.WINSOCK.H: 这是WINSOCK API的头文件,需要包含在项目中。
2.WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。
3.WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。
1)在初始化阶段调用WSAStartup()
此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。在程式中调用该函数的形式如下:
int WSAStartup (WORD wVersionRequested,LPWSADATA lpWSAData);
其中第一个参数为你所想需要的Winsock版本!低字节为主版本,高字节为副版本!由于目前Winsock有两个版本:1.1和2.2,因此该参数可以是0x101或0x202;二个参数是一个WSADATA结构,用于接收函数的返回信息!WSAStartup函数调用成功会返回0,否则返回非0值!在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup。
使用示例:
WSADATA wsaData;
if(WSAStartup(0x101,&wsaData))
{
//错误处理!
}
2)建立Socket
创建套接字有两个函数,socket和WSASocket,前者是标准的Socket函数,而后者是微软对Socket的扩展函数。socket函数调用成功返回一个套接字描述符,错误则返回SOCKET_ERROR。
SOCKET PASCAL FAR WSASocket ( int af, int type, int protocol )
参数:
af: 第一个是指定通信发生的区域,在UNIX下有AF_UNIX、AF_INET、AF_NS等,而在Winsock1.1下只支持AF_INET,到了2.2则添了AF_IRDA(红外线通信)、AF_ATM(异步网络通信)、AF_NS、AF_IPX等。
type:第2个参数是套接字的类型,在AF_INET地址族下,有SOCK_STREAM、SOCK_DGRAM、SOCK_RAW三种套接字类型。SOCK_STREAM也就是通常所说的TCP,而SOCK_DGRAM则是通常所说的UDP,而SOCK_RAW则是用于提供一些较低级的控制的;
protocol:依赖于第2个参数,用于指定套接字所用的特定协议,设为0表示使用默认的协议。
使用示例:
SOCKET sk;
sk=socket(AF_INET,SOCK_STREAM,0);
if(sk==SOCKET_ERROR)
{
//错误处理
}
3)绑定端口
接下来要为服务器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。
int PASCAL FAR bind( SOCKET s, const struct sockaddr FAR *name,int namelen );
参 数: s:Socket对象名;
name:Socket的地址值,这个地址必须是执行这个程式所在机器的IP地址;
namelen:name的长度;
如果使用者不在意地址或端口的值,那么可以设定地址为INADDR_ANY,及Port为0,Windows Sockets 会自动将其设定适当之地址及Port (1024 到 5000之间的值)。此后可以调用getsockname()函数来获知其被设定的值。
4)监听
当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。listen()函数使服务器端的Socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5, 最小值为1)。该函数调用成功返回0,否则返回SOCKET_ERROR。
int PASCAL FAR listen( SOCKET s, int backlog );
参 数: s:需要建立监听的Socket;
backlog:最大连接个数;
服务器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server 端必须再调用accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0,否则返回SOCKET_ERROR。
int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent );
参数: s:Socket 对象;
hWnd :接收消息的窗口句柄;
wMsg:传给窗口的消息;
lEvent:被注册的网络事件,也即是应用程序向窗口发送消息的网路事件,该值为下列值FD_READ、FD_WRITE、FD_OOB、FD_ACCEPT、FD_CONNECT、FD_CLOSE的组合,各个值的具体含意为FD_READ:希望在套接字S收到数据时收到消息;FD_WRITE:希望在套接字S上可以发送数据时收到消息;FD_ACCEPT:希望在套接字S上收到连接请求时收到消息;FD_CONNECT:希望在套接字S上连接成功时收到消息;FD_CLOSE:希望在套接字S上连接关闭时收到消息;FD_OOB:希望在套接字S上收到带外数据时收到消息。
具体应用时,wMsg应是在应用程序中定义的消息名称,而消息结构中的lParam则为以上各种网络事件名称。所以,可以在窗口处理自定义消息函数中使用以下结构来响应Socket的不同事件:
switch(lParam)
{case FD_READ:
…
break;
case FD_WRITE、
…
break;
…
}
5)服务器端接受客户端的连接请求
当Client提出连接请求时,Server 端hwnd视窗会收到Winsock Stack送来我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件。为了使服务器端接受客户端的连接请求,就要使用accept() 函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。
SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );
参数:s:Socket的识别码;
addr:存放来连接的客户端的地址;
addrlen:addr的长度
6)结束 socket 连接
结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,只要调用closesocket()就可以了,而要关闭Server端监听状态的socket,同样也是利用此函数。另外,与程序启动时调用WSAStartup()函数相对应,程式结束前,需要调用 WSACleanup() 来通知Winsock Stack释放Socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。
int PASCAL FAR closesocket( SOCKET s );
参 数:s:Socket 的识别码;
int PASCAL FAR WSACleanup( void );
参 数: 无
二、客户端Socket的操作
1)建立客户端的Socket
客户端应用程序首先也是调用WSAStartup() 函数来与Winsock的动态连接库建立关系,然后同样调用socket() 来建立一个TCP或UDP socket(相同协定的 sockets 才能相通,TCP 对 TCP,UDP 对 UDP)。与服务器端的socket 不同的是,客户端的socket 可以调用 bind() 函数,由自己来指定IP地址及port号码;但是也可以不调用 bind(),而由 Winsock来自动设定IP地址及port号码。
分享到:
相关推荐
在标题"socket 一个服务器对应多个客户端使用多线程"中,提到的是使用Socket编程来设计一个服务器,该服务器能够同时处理来自多个客户端的连接请求,这通常被称为“一对一”或“一对多”模型。在Linux环境下,这种...
【程序老媛出品,必属精品...资源名:VB SOCKET一对多通讯 客户端和服务端程序源码 资源类型:程序源代码 源码说明: 基于VB编写的socket 一对多通信实例源码 包含客户端和服务端 适合人群:新手及有一定经验的开发人员
在这个“socket一对多端口转发源码”中,核心逻辑应该是这样的: 1. **创建ServerSocket实例**:程序首先会创建一个`ServerSocket`对象,绑定到本地的特定端口,开始监听。这个端口就是数据进入的入口。 2. **接受...
在这个名为"socket一个简单的程序"的示例中,我们将会探讨如何构建一个基础的客户端和服务端模型,这对于理解Socket工作原理及其在实际开发中的应用至关重要。 首先,让我们了解什么是Socket。Socket,即套接字,是...
本文将深入探讨“Socket一对一”和“Socket一对多”多线程应用,并结合Java IO流的使用,来理解如何构建这样的系统。 首先,让我们了解Socket的基本概念。Socket,也被称为套接字,是网络编程中的一个接口,它允许...
Qt下UDPSocket一段时间后接收不到数据的问题
本文将深入探讨如何在C++环境中,使用Visual Studio (VS) 开发工具,通过Socket API实现多组一对一的通信机制。 首先,我们需要理解Socket编程的基本概念。Socket是网络通信中的接口,它允许应用程序通过网络发送和...
Java应用Socket通讯一对多: ⑴、一对多; ⑵、通过list/map存储连接的socket对象,服务端向所有客户端群发消息,可以修改为服务端向指定客户端发送消息; ⑶、自动定时扫描客户端,移除断开的连接。
描述中的"一个socket对应多个client,每个socket开启一个新的线程"表明服务器会为每个新的客户端连接创建一个新的socket实例,并且在一个单独的线程中运行,这样就可以避免因一个客户端的阻塞操作(如等待输入)而...
在IT领域,网络编程是不可或缺的一部分,而Socket编程则是实现网络通信的基础。本文将深入探讨如何利用Socket进行连续发送与连续接收数据,基于标题“利用socket连续发送与连续接收数据”以及描述中提到的实现过程。...
Socket编程是一种用于网络通信的技术,它允许不同计算机系统之间建立双向的数据流。在PHP中,使用`socket_*`函数族可以轻松地创建、管理和操作Socket。本案例中,我们关注的是基于TCP协议的Socket通信,它提供了一个...
当需要发送的数据量较大时,一次发送可能会超过Socket的缓冲区大小,这时就需要将大数据拆分成多个小的数据包(也称为帧或消息),逐个发送。同样,服务端也需要将接收到的小数据包重新组合成原始的大数据。在TCP中...
本文将深入讲解“基于socket的一对多通讯原型”,这是一个适合初学者入门的实例,帮助理解如何使用Socket实现服务器与多个客户端之间的通信。 首先,我们来看“Socket”是什么。Socket,又称为套接字,是操作系统...
Socket编程是网络通信的核心技术,它为应用程序提供了一种通过网络发送和接收数据的方法。在本文中,我们将深入探讨如何使用Socket实现一对一的聊天应用,包括客户端和服务端的设计与实现。 **1. Socket基础** ...
3. **文件分块**:由于Socket一次只能传输有限大小的数据,所以大文件需要被分割成多个小块进行传输。可以设定一个合适的块大小,例如1MB,然后逐块发送。 4. **发送文件元信息**:在实际传输文件前,需要先发送...
在主线程中通过控制台读取键盘...服务器在收到一个socket连接之后,把该socket保存到队列中,并对队列中的每个socket开启各自的读写线程。测试可以在不同控制台运行server和client,服务器接收消息时,会显示消息来源
下面小编就为大家带来一篇Linux下高并发socket最大连接数所受的各种限制(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
接着刚才上传的qt socket one by one ,并程,多线程,最终完善了容错,和中英文,基本实现qt 局域网通信小程序。。。注意,阅读readme ,我编写的server 要用我的client 端接收(有设计字符格式问题)。。然后完事...
10004—WSAEINTR 函数调用中断。该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。
在IT行业中,网络编程是不可或缺的一部分,而Socket编程则是实现网络通信的基础。"单线程一对一聊天SOCKET"是一个简单的网络通信示例,它利用C++语言,结合MFC(Microsoft Foundation Classes)库来实现。这里我们将...