互联网原理与应用实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华南师范大学本科学生实验报告
实验课程:互联网原理与应用
实验名称:SOCKET网络程序设计
一、实验目标:
a、进一步掌握UDP及TCP协议的工作原理
b、掌握SOCKET编程的基本方法
c、学习应用C语言与WinSock2进行简单的无连接的网络程序设计,实现网络数
二、实验原理:
1、关于使用套接字编程的一些基本概念
(a) 半相关与全相关
(b) TCP/IP协议的地址结构
struct sockaddr_in{
short sin_family; /*AF_INET*/
u_short sin_port; /*16位端口号,网络字节顺序*/
struct in_addr sin_addr; /*32位IP地址,网络字节顺序*/
char sin_zero[8]; /*保留*/
}
(c) 套接字类型
TCP/IP的socket提供下列三种类型套接字。

流式套接字(SOCK_STREAM)、数据报式套接字(SOCK_DGRAM)
原始式套接字(SOCK_RA W)
(d) 基本套接字系统调用
(1) 创建套接字──socket()
(2) 指定本地地址──bind()
(3) 建立套接字连接──connect()与accept()
(4) 监听连接──listen()
(5) 数据传输──send()与recv()
(6) 输入/输出多路复用──select()
(7) 关闭套接字──closesocket()
2、用于无连接协议(如UDP)的SOCKET系统调用流程框图
3、面向连接协议(如TCP)的SOCKET系统调用流程框图
三、实验设备及材料:
计算机、路由器
四、实验流程或装置示意图
a、用于无连接协议(如UDP)的SOCKET系统调用流程框图:
b 、面向连接协议(如TCP )的SOCKET 系统调用流程框图
五、实验步骤:
服务员
建立连接
数据(请求)
数据(回答)
send()
Socket()
connect ()
recv()
客户
Socket()
Bind()
等待来自客户的数据
recvfrom()
sendto()
数据处理
服务员 数据(请
数据(回
Socket()
sendto()
recvfrom()
客户
bind()
Listen()
Socket()
Bind()
等待来自客户的连接请求
accept()
send()
recv()
数据处理
使用UDP协议的无连接客户-服务员程序设计。

根据实验原理中介绍的内容,设计一个无连接的客户-服务员系统,实现二者之间的数据传递。

六、实验程序:
客户端程序:
#include <stdio.h>
#include <winsock.h>
#define SERV_UDP_PORT 8888 /*服务员进程端口号,视具体情况而定*/
#define CLIENT_UDP_PORT 8080
#define SERV_HOST_ADDR "193.169.1.41" /*服务员地址,视具体情况而定*/
#define CLIENT_HOST_ADDR "193.169.1.42"
#define SERVER_ADD 0xc1a90134
#define CLIENT_ADD 0xc1a90133
#pragma comment(lib,"ws2_32.lib")
/* 宏定义用来打印错误消息*/
#define PRINTERROR(s) \
fprintf(stderr,"\n%: %d\n", s, WSAGetLastError())
////////////////////////////////////////////////////////////
//数据报通信的客户端子程序 //
////////////////////////////////////////////////////////////
void DatagramClient(short nPort)
{
SOCKET theSocket;
/*创建一个数据报类型的socket*/
theSocket = socket(AF_INET, // 地址族
SOCK_DGRAM, // socket类型
IPPROTO_UDP);// 协议类型:UDP
/*错误处理*/
if (theSocket == INVALID_SOCKET)
{
PRINTERROR("socket()");
return;
}
/*填写客户端地址结构*/
SOCKADDR_IN saClient;
saClient.sin_family = AF_INET;
saClient.sin_addr.s_addr = inet_addr(CLIENT_HOST_ADDR); // 由WinSock指定地址
saClient.sin_port = htons(nPort); // 客户端进程端口号
/* 将客户端地址与已创建的socket绑定*/
int nRet;
nRet = bind(theSocket, // Socket 描述符
(LPSOCKADDR)&saClient, // 客户端地址
sizeof(struct sockaddr) //地址长度
);
/*错误处理*/
if (nRet == SOCKET_ERROR)
{
PRINTERROR("bind()");
closesocket(theSocket);
return;
}
SOCKADDR_IN saServer;
char szBuf[1024];
int nLen;
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR);
saServer.sin_port = htons(SERV_UDP_PORT);
nLen = sizeof(saServer);
while(1)
{
/* 发送数据给服务器 */
//strcpy(szBuf,"From the client");
scanf("%s",&szBuf);
sendto(theSocket,szBuf,strlen(szBuf),0,(LPSOCKADDR)&saServer,nLen);
//system("pause");
/* 接收来自服务器端的数据*/
memset(szBuf,0,sizeof(szBuf));
nRet = recvfrom(theSocket,szBuf,sizeof(szBuf),0,(LPSOCKADDR)&saServer,&nLen);
if(szBuf[0]!=0)
printf("\nData received: %s\n",szBuf);
}
// while(1)
// {
// /*准备接收数据*/
//
// memset(szBuf, 0, sizeof(szBuf));
// nRet = recvfrom(theSocket, // 已绑定的socket
// szBuf, // 接收缓冲区
// sizeof(szBuf), // 缓冲区大小
// 0, // Flags
// (LPSOCKADDR)&saClient, // 接收客户端地址的缓冲区
// &nLen); // 地址缓冲区的长度
//
// /*打印接收到的信息*/
//
// printf("\nData received: %s", szBuf);
//
// /* 发送数据给客户端*/
//
// strcpy(szBuf, "From the Server");
// sendto(theSocket, // 已绑定的socket // szBuf, // 发送缓冲区
// strlen(szBuf), // 发送数据的长度// 0, // Flags
// (LPSOCKADDR)&saClient, // 目的地址
// nLen); // 地址长度
// }
closesocket(theSocket);
return;
}
//////////////////////////////////////////////////////////// //数据报客户端主程序 // //////////////////////////////////////////////////////////// void main()
{
WORD wVersionRequested = MAKEWORD(1,1);
WSADATA wsaData;
int nRet;
short nPort;
nPort = CLIENT_UDP_PORT;
/* 初始化Winsock*/
nRet = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested)
{
fprintf(stderr,"\n Wrong version\n");
return;
}
/*调用数据客户端子程序*/
DatagramClient(nPort);
/*结束WinSock*/
WSACleanup();
}
七、思考问题:
在客户/服务器模型当中,客户进程的端口号和服务器进程的端口号都是由程序给出说明的吗?为什么?
答:是的,客户端程序通过指定的端口号来寻早相应的服务进程。

相关文档
最新文档