西工大计算机网络实验三文档格式.docx
《西工大计算机网络实验三文档格式.docx》由会员分享,可在线阅读,更多相关《西工大计算机网络实验三文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
![西工大计算机网络实验三文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/c5d0b187-a80d-4729-8ea8-f284f25ad419/c5d0b187-a80d-4729-8ea8-f284f25ad4191.gif)
//客户地址长度
intiLen=0;
//发送的数据长度
intiSend=0;
//接收的数据长度
intircv=0;
//处世要发送给客户的信息
charbuf[20]="
Iamaserver"
;
//接收来自用户的信息
charfromcli[512];
//客户和效劳器的SOCKET地址构造
structsockaddr_inser,cli;
if(WSAStartup(MAKEWORD(2,2),&
wsaData)!
=0)
{
cout<
<
"
failedtoloadwinsock"
endl;
return0;
}
serverwaiting"
---------------"
//创立效劳器端帧听SOCKET
oldSocket=socket(AF_INET,SOCK_STREAM,0);
if(oldSocket==INVALID_SOCKET)
socket()failed:
WSAGetLastError()<
//以下是建立效劳器端的SOCKET地址构造
ser.sin_family=AF_INET;
ser.sin_port=htons(5050);
//使用系统指定的ip地址INADDR_ANY
if(bind(oldSocket,(LPSOCKADDR)&
ser,sizeof(ser))==SOCKET_ERROR)
bind()failed:
//进入侦听状态
if(listen(oldSocket,5)==SOCKET_ERROR)
listen()failed:
//接收客户端的连接
iLen=sizeof(cli);
newSocket=accept(oldSocket,(structsockaddr*)&
cli,&
iLen);
//产生一个新的SOCKET
if(newSocket==INVALID_SOCKET)
cout<
accept()failed:
//
return0;
//进入一个无限循环,等待客户发送数据
while
(1)
i++;
//效劳器初始化接收缓冲区
memset(fromcli,0,512);
ircv=recv(newSocket,fromcli,sizeof(fromcli),0);
if(ircv==SOCKET_ERROR)
rcv()failed:
break;
elseif(ircv==0)
break;
else{
-----效劳器接收的容为--------"
fromcli<
}
if(strcmp(fromcli,"
quit"
)==0)
closesocket(newSocket);
closesocket(oldSocket);
WSACleanup();
}
客户端:
winsock2.h>
stdio.h>
#defineDATA_BUFFER512
SOCKETsClient;
charch;
随着程序所在主机的地址改变而改变
intSeriPort=5050;
//从效劳器接收的数据的长度
intiLen;
intisnd;
//接收缓冲区
charbuf[DATA_BUFFER];
//发送缓冲区
charsndbuf[DATA_BUFFER];
//效劳器端SOCKET地址构造
structsockaddr_inser;
//接收/发送缓冲区的初始化
memset(buf,0,sizeof(buf));
memset(sndbuf,0,DATA_BUFFER);
//填写要连接的效劳器地址信息
ser.sin_family=AF_INET;
ser.sin_port=htons(SeriPort);
//建立客户端字节流式套接字
sClient=socket(AF_INET,SOCK_STREAM,0);
if(sClient==INVALID_SOCKET)
socket()failed:
//请求与效劳器建立连接
//cout<
setlink"
if(connect(sClient,(structsockaddr*)&
ser,sizeof(ser))==INVALID_SOCKET)
connect()failed:
"
else
{//向效劳器端发送数据
while
(1)
{
cout<
i++;
第"
i<
发送"
cin>
>
sndbuf;
isnd=send(sClient,sndbuf,sizeof(sndbuf),0);
if(isnd==0)
return0;
elseif(isnd==SOCKET_ERROR)
{
cout<
send()failed:
}
-----客户端发送容为----"
sndbuf<
closesocket(sClient);
本机上客户端与效劳器端通信结果如图:
在两台效劳器上分别运行效劳器端和客户端,结果如图:
UDP通信
#include"
stdafx.h"
#include<
#definebuffer_length512
voidmain()
WSADATAwsadata;
SOCKETsSocket;
intilen;
intirecv;
charrecv_buf[buffer_length];
charsend_buf[buffer_length];
//效劳器和客户SOCKET地址构造
structsockaddr_inseradd,cliadd;
wsadata)!
printf("
failedtoloadwinsocket\n"
);
return;
sSocket=socket(AF_INET,SOCK_DGRAM,0);
if(sSocket==INVALID_SOCKET)
%d\n"
WSAGetLastError());
//初始化效劳器SOCKET地址构造
seradd.sin_family=AF_INET;
seradd.sin_port=htons(6666);
if(bind(sSocket,(LPSOCKADDR)&
seradd,sizeof(seradd))==SOCKET_ERROR)
地址绑定时出错:
intrua;
scanf("
%d"
&
rua);
ilen=sizeof(cliadd);
//初始化接收缓冲区
memset(recv_buf,0,sizeof(recv_buf));
irecv=recvfrom(sSocket,recv_buf,buffer_length,0,(structsockaddr*)&
cliadd,&
ilen);
if(irecv==SOCKET_ERROR)
接收出错%d\n"
elseif(irecv==0)
else
\n%s--"
recv_buf);
ServerreceivedfromClientip:
[%s],port:
[%d]\n"
inet_ntoa(cliadd.sin_addr),ntohs(cliadd.sin_port));
}
//在此函数中cli为传出参数
irecv=recvfrom(sSocket,recv_buf,buffer_length,0,(structsockaddr*)&
if(irecv==SOCKET_ERROR)
printf("
intrua;
return;
else
}
%s"
send_buf);
sendto(sSocket,send_buf,sizeof(send_buf),0,(structsockaddr*)&
cliadd,sizeof(cliadd));
closesocket(sSocket);
#definedata_buffer1024
SOCKETsclient;
//效劳器地址、端口号
intSeriport=6666;
charch[]="
qita"
//效劳器SOCKET地址构造长度
intilen;
//发送/接收数据大小
intisend;
//要发送给效劳器的数据
charsend_buf[]="
hello,Iamaclient."
charrecv_buf[data_buffer];
//效劳器端的SOCKET地址构造
structsockaddr_inseradd,cliadd;
memset(recv_buf,0,sizeof(recv_buf));
//字符数组初始化
memset(ch,0,sizeof(ch));
failedtoloadwinsock\n"
//效劳器SOCKET地址构造初始化
seradd.sin_port=htons(Seriport);
cliadd.sin_family=AF_INET;
cliadd.sin_port=htons(7777);
sclient=socket(AF_INET,SOCK_DGRAM,0);
if(sclient==INVALID_SOCKET)
buildsocketfailed!
\n"
if(bind(sclient,(LPSOCKADDR)&
cliadd,sizeof(cliadd))==SOCKET_ERROR)
//无连接不需要进展地址与套接字的绑定,直接发送数据即可
ilen=sizeof(seradd);
isend=sendto(sclient,send_buf,sizeof(send_buf),0,(structsockaddr*)&
seradd,ilen);
if(isend!
=0&
&
isend!
=SOCKET_ERROR)
//printf("
datahasbeensentsuccessfully!
客户所发的数据为:
%s,字节数为:
send_buf,isend);
elsereturn;
ch);
sendto(sclient,ch,sizeof(ch),0,(structsockaddr*)&
seradd,sizeof(seradd));
irecv=recvfrom(sclient,recv_buf,data_buffer,0,(structsockaddr*)&
seradd,&
scanf("
break;
inet_ntoa(seradd.sin_addr),ntohs(seradd.sin_port));
closesocket(sclient);
三、实验中出现的问题
实验中,因为对TCP和UDP中的代码不熟悉,编译时也缺少了头文件,导致在编译时一直都没有通过,最后在教师的提醒下知道了错误所在,才能编译通过。
思考题:
问:
与本机配置的网络ip地址还有localhost,相互有什么区别?
答:
localhost是个域名,不是地址,它可以被配置为任意的IP地址,不过通常情况下都指向和[:
:
1](ipv6)
整个127.*网段通常被用作loopback网络接口的默认地址,按惯例通常设置为。
这个地址在其他计算机上不能访问,就算你想访问,访问的也是自己,因为每台带有TCP/IP协议栈的设备根本上都有。
本机地址通常指的是绑定在物理或虚拟网络接口上的IP地址,可供其他设备访问到。
四、心得体会
在本次试验之前,我对于socket编程并不了解,通过向同学请教以及从网上查找资料,对于这个问题我有了初步的了解,能够进展简单的应用,实现了本机以及联机的TCP协议以及UDP协议通讯。
这次实验主要是通过改写代码实现两台计算机之间tcp/udp通信,做起来问题不大,但在代码的理解以及使用上有一定的难度,主要都是通过问同学来解决问题。
通过这次实验,明白了计算机是如何进展tcp/udp通信,更加强化了理论知识。