Socket新手教程(一)
最近学习了一下socket,有一些心得体会,作为刚进门写给门外的朋友。
本教程将一步一步从一个最简单的通信程序一直到最后一个包含数据库的类似于QQ的聊天系统。本教程大部分讨论的都是TCP协议,在使用UDP协议的时候都会指出
其中的例子涉及常用的Socket模型:阻塞模型(多线程),Select模型,WSAEventSelect模型(暂定),未来可能更新IOCP模型
本篇内容:
C/S架构的Socket程序样本
WinSock库的加载和释放
Socket的寻址方式
最基本的Socket程序
好吧,让我们开始:
本教程篇幅有限,对于Socket的基本概念不多说了,相信看到本教程的朋友都知道什么是Socket了
有兴趣可以看下:http://baike.baidu.com/view/13870.htm
C/S架构的Socket程序都包含服务端和客户端两部分,对于开发者,无非就是按照步骤调用相应函数。
以下是基于TCP的Socket程序编写步骤:
服务端:
函数 作用
socket() //创建套接字
bind() //绑定套接字
listen() //开始监听
accept() //等待客户端连接,一般是个循环,链接成功得到一新套接字,用来和客户端通信,使用recv()和send()函数
closesocket() //与客户端的通信结束,关闭
closesocket() //关闭服务端的套接字
客户端:
函数 作用
socket() //创建套接字
connect() //连接到服务端,链接成功开始使用recv()/send()函数进行通信,一般recv()在个线程中等待接收
closesocket() //关闭套接字,通信结束
以下是基于UDP的Socket程序编写步骤:
服务端:
函数 作用
socket() //创建套接字
recvfrom()/sendto() //收发数据
closesocket() //关闭服务端的套接字
客户端:
函数 作用
socket() //创建套接字
recvfrom()/sendto() //收发数据
closesocket() //关闭连接
由于UDP协议是无连接的,所以省去了绑定和监听的过程。
异步Socket模型不过是将以上步骤中的监听、收发进行封装。
初始化:
windows下的Socket库成为WinSock,它是由UNIX下的Socket库发展而来的。
使用步骤:
//包含库文件
#include <winsock2.h>
#param comment(lib,"WS2_32")
//初始化库
int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );
//释放库
int WSACleanup (void);
C++中有类这个概念,所以我们可以写给类,将初始化库的代码写到构造函数中,将释放库的代码写到析构函数中去,之后创建一全局对象就可以实现初始化库和释放库的功能。
示例代码:
#include <winsock2.h>
#pragma comment(lib,"WS2_32")
class InitSocket
{
public:
InitSocket(BYTE minorVer = 2, BYTE majorVer = 2)
{
WSADATA wsaData;
WORD sockVersion = MAKEWORD(minorVer,majorVer);
if(::WSAStartup(sockVersion,&wsaData) != 0)
{
exit(0);
}
}
~InitSocket()
{
WSACleanup();
}
};
InitSocket initSock;