西工大计算机网络实验三文档格式.docx

上传人:b****4 文档编号:8041942 上传时间:2023-05-09 格式:DOCX 页数:18 大小:382.36KB
下载 相关 举报
西工大计算机网络实验三文档格式.docx_第1页
第1页 / 共18页
西工大计算机网络实验三文档格式.docx_第2页
第2页 / 共18页
西工大计算机网络实验三文档格式.docx_第3页
第3页 / 共18页
西工大计算机网络实验三文档格式.docx_第4页
第4页 / 共18页
西工大计算机网络实验三文档格式.docx_第5页
第5页 / 共18页
西工大计算机网络实验三文档格式.docx_第6页
第6页 / 共18页
西工大计算机网络实验三文档格式.docx_第7页
第7页 / 共18页
西工大计算机网络实验三文档格式.docx_第8页
第8页 / 共18页
西工大计算机网络实验三文档格式.docx_第9页
第9页 / 共18页
西工大计算机网络实验三文档格式.docx_第10页
第10页 / 共18页
西工大计算机网络实验三文档格式.docx_第11页
第11页 / 共18页
西工大计算机网络实验三文档格式.docx_第12页
第12页 / 共18页
西工大计算机网络实验三文档格式.docx_第13页
第13页 / 共18页
西工大计算机网络实验三文档格式.docx_第14页
第14页 / 共18页
西工大计算机网络实验三文档格式.docx_第15页
第15页 / 共18页
西工大计算机网络实验三文档格式.docx_第16页
第16页 / 共18页
西工大计算机网络实验三文档格式.docx_第17页
第17页 / 共18页
西工大计算机网络实验三文档格式.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

西工大计算机网络实验三文档格式.docx

《西工大计算机网络实验三文档格式.docx》由会员分享,可在线阅读,更多相关《西工大计算机网络实验三文档格式.docx(18页珍藏版)》请在冰点文库上搜索。

西工大计算机网络实验三文档格式.docx

//客户地址长度

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通信,更加强化了理论知识。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2