您申请加入课程:Computer  Networks  B
需要验证您的身份,请输入请求信息:
您的学号:
班级选择:
附注信息:
  • 创建者

    Creator

    曾德泽
  • 活跃度

    Activeness

  • 访问量

    Visits

    1587

教学公告

基于套接字的Ping程序设计
[作者: 曾德泽  发布时间:2015-06-05 19:47:21  浏览次数:655次]

一、Client/Server网络编程模型:

Client/Server网络编程基于socket编程基础,socket(套接字编程)源于Unix,想深入学习的同学可以查找相关的资料进行学习。

Windows socket编程思想也是源于Unix socket,相关的函数都是直接拿过来用,只有部分的变量定义有些区别。套接字有两种类型:

流式套接字(SOCK_STREAM),基于TCP传输协议,面向连接,可靠的传输方式。

数据报式套接字(SOCK_DGRAM,基于UDP,面向无连接,不可靠。

下面是关于TCPUDP socket编程的流程图:

TCP:

UDP:

windows上进行socket编程,需要引入相关的库文件:

#include

相关函数讲解:

加载套接字库并进行版本协商

Int WSAStartup(WORD wVersionRequested,

//请求的版本号,低字节代表主版本,高字节代表副版本,一般我们用MAKEWORDx,y//宏来指定版本号,如:MAKEWORD2,1)代表2.1的版本

LPWSADATA lpWSAData

//out,一个WSADATA结构体指针,用于接收实际加载的套接字 库版本号

)

创建套接字

SOCKET socket(int af, //指定协议族,也即网际域,对于windows平台总是AF_INET PF_INET

Int type,//指定要创建的套接字类型

Int protocol//指定协议类型,我们一般设为0,让他根据我们前两个参数自动设置

绑定到本机地址和端口

int bind(SOCKET s, //已创建的套接字描叙符

const struct sockaddr FAR *name, //要绑定的本机地址信息

Int namelen //第二个参数的长度

其中要注意第二个参数,由于第二个参数适用于所有网络协议,所以我们可以根据需要进行替换,如我们常常这样定义一个AF_INET 的地址信息:

SOCKADDR_IN SrvAddr;

SrvAddr.family=AF_INET;

SrvAddr.port=hotns(666; //其中666代表端口号

SrvAddr.sin_addr.S_un.S_addr=htonl(192.168.1.101);

//SrvAddr.sin_addr.S_un.S_addr=INADDR_ANY;(指绑定到本机的任一快网卡上,并且////其本身就是网络字节序,故无需转换,我推荐这种写法)

Inet_addrinet_ntoa函数

Unsigned long Inet_addr(sconst char FAR * cp);

Inet_addr可以把一个点分十进制表示的IP(如:192.168.1.101)转换为unsinged long 类型的数据,且该返回值可以直接赋值给S_addr

Char FAR * inet_ntoa(struct in_addr in);

Inet_ntoa 从他函数的声明就知道他完成一个和inet_addr相反的转换

将指定的套接字设为见听听模式

Int listen(SOCKET s,int backlog);

第一个参数 s: 已经创建的套接字描述符

第二个参数 backlog 设置等待连接队伍的最大长度,注意:不是一个端口上可以同时连接的数目。

Accept函数

就收客服端发送的连接请求

SOCKET accept(

SOCKET s,

Struct sockaddr FAR * addr,// 返回请求连接方的IP和端口信息

Int FAR * addrlen

);

Send函数

通过一个已经建立连接的套接字发送数据

Int send(

SOCKET s,//注意:是以建立连接的套接字

Const char FAR * buf,//目的地IP和端口信息

Int len,

Int falgs//该设置影响发送行为,我们一般设为0

)

Recv 函数

Int recv(

SOCKET s,

Char FAR *buf,//发送数据的缓存地址

Int len,//发送数据长度

Int flags//该设置影响发送行为,我们一般设为0

)

Connect 函数

和一个特定的套接字建立连接

Int connect(

SOCKET s,

Const struct sockaddr FAR * name,//目的地址信息

Int namelen

)

Recvfrom函数

接受一次数据并保存数据源地址信息

Int recvfrom(

SOCKET s,

Char FAR*buf,

Int len,

Int flags,

Struct sockaddr FAR* from//用于保存数据源地址信息

Int FAR* fromlen

);

注意:最后一个参数是in,out类型,我们要在传参之前赋初始值

如:int len=Sizeof(SOCKADDR);

Sendto函数

向以一个特定的目的方发送数据

Int sendto(

SOCKET s,

Const char FAR * buf,//要发送的数据

Int len,//数据长度

Int flags,

Connect struct sockaddr FAR * to,//目的地址信息

Int tolen

)

二、编程要求:

客户端ping服务器端,服务器端显示客户端发送数据的时间戳(如19:00:32),然后给客户端响应消息(pong)(可以随便是什么消息),客户端接收响应并输出,并显示时间时延,比如:延时5s

客户端:

输入: ping 127.0.0.1

输出: ping success or ping failed.

服务端发送的消息

延时:xx s

服务端:

显示客户端发送的消息(时间戳):

如:客户端发送数据的时间为19:00:32

PingServer.c

//#include "stdafx.h"

#include

#include

#include

#include

#pragma comment()

//处理客户端发送的数据并响应

int PingServer()

{

//创建套接字

//绑定IP和端口

//开始监听

//循环接收数据

//接收数据

//打印客户端发送的数据,显示时间戳

//发送数据

}

int main(int argc, char* argv[])

{

PingServer();

return 0;

}

PingClient.c

// PingClient.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

//#include "stdafx.h"

#include

#include

#include

#include

#include

#pragma comment

#define MAXN 1024

//#define IP_Address "1"

//客户端ping程序,socket编程流程

int PingClient()

{

//得到服务器的地址

char *serverIP = GetServerIP(strServerIP);

//连接服务器的IP地址

//得到发送的数据,要求发送的数据为客户端的时间戳

GetSendData(sendData); //process sending data

//cout << sendData;

//发送

send(sclient, sendData, strlen(sendData), 0);

//接受

int ret = recv(sclient, recData, 255, 0);

//得到接受时间

t2 = GetCurrentTime();

//得到服务器端发送的数据,打印数据接收的时

int main(int argc, char* argv[])

{

PingClient();

return 0;

}



相关课程

扫一扫二维码,快速加入本课程!

放大二维码 查看使用方法
关闭