计算机网络实验二.docx
《计算机网络实验二.docx》由会员分享,可在线阅读,更多相关《计算机网络实验二.docx(23页珍藏版)》请在冰豆网上搜索。
计算机网络实验二
实验报告
学院(系)名称:
计算机与通信工程学院
姓名
Sky
学号
专业
计算机科学与技术
班级
2班
实验名称
基于TCP/UDP的Socket编程
课程名称
计算机网络
课程代码
0662016
实验时间
2016年4月18日14:
00-15:
40
实验地点
7-219
批改意见
成绩
教师签字:
1.实验目的
了解套接字(socket)实现原理。
通过编成理解TCP、UDP原理,加深对传输层的功能理解
2.实验环境
VC++6.0
3.实验过程记录(源程序、测试用例、测试结果及心得体会等)
传送字符串:
Clinet端源码:
#defineWIN32_LEAN_AND_MEAN
#include
#pragmacomment(lib,"ws2_32.lib")
#defineDEFAULT_PORT2007
#defineDEFAULT_PROTOSOCK_STREAM
voidUsage(char*progname)
{
fprintf(stderr,"Usage:
%s-p[protocol]-n[servername/IP]-e[port_num]-l[iterations]\n",progname);
fprintf(stderr,"Where:
\n\tprotocolisoneofTCPorUDP\n");
fprintf(stderr,"\t-serveristheIPaddressornameofserver\n");
fprintf(stderr,"\t-port_numistheporttolistenon\n");
fprintf(stderr,"\t-iterationsisthenumberofloopstoexecute.\n");
fprintf(stderr,"\t-(-lbyitselfmakesclientruninaninfiniteloop,\n");
fprintf(stderr,"\t-HitCtrl-Ctoterminateit)\n");
fprintf(stderr,"\t-ThedefaultsareTCP,localhostand2007\n");
WSACleanup();
exit
(1);
}
intmain(intargc,char**argv)
charBuffer[128];
char*server_name="localhost";
unsignedshortport=DEFAULT_PORT;
intretval,loopflag=0;
inti,loopcount,maxloop=-1;
unsignedintaddr;
intsocket_type=DEFAULT_PROTO;
structsockaddr_inserver;
structhostent*hp;
WSADATAwsaData;
SOCKETconn_socket;
if(argc>1)
for(i=1;i{if((argv[i][0]=='-')||(argv[i][0]=='/')){switch(tolower(argv[i][1])){case'p':if(!stricmp(argv[i+1],"TCP"))socket_type=SOCK_STREAM;elseif(!stricmp(argv[i+1],"UDP"))socket_type=SOCK_DGRAM;elseUsage(argv[0]);i++;break;case'n':server_name=argv[++i];break;case'e':port=atoi(argv[++i]);break;case'l':loopflag=1;if(argv[i+1]){if(argv[i+1][0]!='-')maxloop=atoi(argv[i+1]);}elsemaxloop=-1;i++;break;default:Usage(argv[0]);break;}}elseUsage(argv[0]);}}if((retval=WSAStartup(0x202,&wsaData))!=0){fprintf(stderr,"Client:WSAStartup()failedwitherror%d\n",retval);WSACleanup();return-1;}elseprintf("Client:WSAStartup()isOK.\n");if(port==0){Usage(argv[0]);}if(isalpha(server_name[0])){//serveraddressisanamehp=gethostbyname(server_name);}else{//Convertnnn.nnnaddresstoausableoneaddr=inet_addr(server_name);hp=gethostbyaddr((char*)&addr,4,AF_INET);}if(hp==NULL){fprintf(stderr,"Client:Cannotresolveaddress\"%s\":Error%d\n",server_name,WSAGetLastError());WSACleanup();exit(1);}elseprintf("Client:gethostbyaddr()isOK.\n");//Copytheresolvedinformationintothesockaddr_instructurememset(&server,0,sizeof(server));memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);server.sin_family=hp->h_addrtype;server.sin_port=htons(port);conn_socket=socket(AF_INET,socket_type,0);/*Openasocket*/if(conn_socket<0){fprintf(stderr,"Client:ErrorOpeningsocket:Error%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Client:socket()isOK.\n");printf("Client:Clientconnectingto:%s.\n",hp->h_name);if(connect(conn_socket,(structsockaddr*)&server,sizeof(server))==SOCKET_ERROR){fprintf(stderr,"Client:connect()failed:%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Client:connect()isOK.\n");//Testsendingsomestringloopcount=0;while(1){wsprintf(Buffer,"Thisisatestmessagefromclient#%d",loopcount++);retval=send(conn_socket,Buffer,sizeof(Buffer),0);if(retval==SOCKET_ERROR){fprintf(stderr,"Client:send()failed:error%d.\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Client:send()isOK.\n");printf("Client:Sentdata\"%s\"\n",Buffer);retval=recv(conn_socket,Buffer,sizeof(Buffer),0);if(retval==SOCKET_ERROR){fprintf(stderr,"Client:recv()failed:error%d.\n",WSAGetLastError());closesocket(conn_socket);WSACleanup();return-1;}elseprintf("Client:recv()isOK.\n");//WearenotlikelytoseethiswithUDP,sincethereisno//'connection'established.if(retval==0){printf("Client:Serverclosedconnection.\n");closesocket(conn_socket);WSACleanup();return-1;}printf("Client:Received%dbytes,data\"%s\"fromserver.\n",retval,Buffer);if(!loopflag){printf("Client:Terminatingconnection...\n");break;}else{if((loopcount>=maxloop)&&(maxloop>0))break;}}closesocket(conn_socket);WSACleanup();return0;}Server端源码:#defineWIN32_LEAN_AND_MEAN#include#include#include#include#pragmacomment(lib,"ws2_32.lib") #defineDEFAULT_PORT2007//defaultTCPsockettype#defineDEFAULT_PROTOSOCK_STREAMvoidUsage(char*progname){fprintf(stderr,"Usage:%s-p[protocol]-e[port_num]-i[ip_address]\n",progname);fprintf(stderr,"Where:\n\t-protocolisoneofTCPorUDP\n");fprintf(stderr,"\t-port_numistheporttolistenon\n");fprintf(stderr,"\t-ip_addressistheipaddress(indotted\n");fprintf(stderr,"\tdecimalnotation)tobindto.Butitisnotusefulhere...\n");fprintf(stderr,"\t-HitCtrl-Ctoterminateserverprogram...\n");fprintf(stderr,"\t-ThedefaultsareTCP,2007andINADDR_ANY.\n");WSACleanup();exit(1);}intmain(intargc,char**argv){charBuffer[128];char*ip_address=NULL;unsignedshortport=DEFAULT_PORT;intretval;intfromlen;inti;intsocket_type=DEFAULT_PROTO;structsockaddr_inlocal,from;WSADATAwsaData;SOCKETlisten_socket,msgsock;/*Parsearguments,ifthereareargumentssupplied*/if(argc>1){for(i=1;i{//switchesoroptions...if((argv[i][0]=='-')||(argv[i][0]=='/')){//Changetolower...ifanyswitch(tolower(argv[i][1])){//if-por/pcase'p':if(!stricmp(argv[i+1],"TCP"))socket_type=SOCK_STREAM;elseif(!stricmp(argv[i+1],"UDP"))socket_type=SOCK_DGRAM;elseUsage(argv[0]);i++;break;//if-ior/i,forserveritisnotsouseful...case'i':ip_address=argv[++i];break;//if-eor/ecase'e':port=atoi(argv[++i]);break;//Nomatch...default:Usage(argv[0]);break;}}elseUsage(argv[0]);}}//RequestWinsockversion2.2if((retval=WSAStartup(0x202,&wsaData))!=0){fprintf(stderr,"Server:WSAStartup()failedwitherror%d\n",retval);WSACleanup();return-1;}elseprintf("Server:WSAStartup()isOK.\n");if(port==0){Usage(argv[0]);}local.sin_family=AF_INET;local.sin_addr.s_addr=(!ip_address)?INADDR_ANY:inet_addr(ip_address);/*PortMUSTbeinNetworkByteOrder*/local.sin_port=htons(port);//TCPsocketlisten_socket=socket(AF_INET,socket_type,0);if(listen_socket==INVALID_SOCKET){fprintf(stderr,"Server:socket()failedwitherror%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:socket()isOK.\n");//bind()associatesalocaladdressandportcombinationwiththesocketjustcreated.//Thisismostusefulwhentheapplicationisa//serverthathasawell-knownportthatclientsknowaboutinadvance.if(bind(listen_socket,(structsockaddr*)&local,sizeof(local))==SOCKET_ERROR){fprintf(stderr,"Server:bind()failedwitherror%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:bind()isOK.\n");//Sofar,everythingwedidwasapplicabletoTCPaswellasUDP.//However,therearecertainstepsthatdonotworkwhentheserveris//usingUDP.Wecannotlisten()onaUDPsocket.if(socket_type!=SOCK_DGRAM){if(listen(listen_socket,5)==SOCKET_ERROR){fprintf(stderr,"Server:listen()failedwitherror%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:listen()isOK.\n");}printf("Server:%s:I'mlisteningandwaitingconnection\nonport%d,protocol%s\n",argv[0],port,(socket_type==SOCK_STREAM)?"TCP":"UDP");while(1){fromlen=sizeof(from);//accept()doesn'tmakesenseonUDP,sincewedonotlisten()if(socket_type!=SOCK_DGRAM){msgsock=accept(listen_socket,(structsockaddr*)&from,&fromlen);if(msgsock==INVALID_SOCKET){fprintf(stderr,"Server:accept()error%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:accept()isOK.\n");printf("Server:acceptedconnectionfrom%s,port%d\n",inet_ntoa(from.sin_addr),htons(from.sin_port));}elsemsgsock=listen_socket;//InthecaseofSOCK_STREAM,theservercandorecv()andsend()on//theacceptedsocketandthencloseit.//However,forSOCK_DGRAM(UDP),theserverwilldorecvfrom()andsendto()inaloop.if(socket_type!=SOCK_DGRAM)retval=recv(msgsock,Buffer,sizeof(Buffer),0);else{retval=recvfrom(msgsock,Buffer,sizeof(Buffer),0,(structsockaddr*)&from,&fromlen);printf("Server:Receiveddatagramfrom%s\n",inet_ntoa(from.sin_addr));}if(retval==SOCKET_ERROR){fprintf(stderr,"Server:recv()failed:error%d\n",WSAGetLastError());closesocket(msgsock);continue;}elseprintf("Server:recv()isOK.\n");if(retval==0){printf("Server:Clientclosedconnection.\n");closesocket(msgsock);continue;}printf("Server:Received%dbytes,data\"%s\"fromclient\n",retval,Buffer);printf("Server:Echoingthesamedatabacktoclient...\n");if(socket_type!=SOCK_DGRAM)retval=send(msgsock,Buffer,
if((argv[i][0]=='-')||(argv[i][0]=='/'))
switch(tolower(argv[i][1]))
case'p':
if(!
stricmp(argv[i+1],"TCP"))
socket_type=SOCK_STREAM;
elseif(!
stricmp(argv[i+1],"UDP"))
socket_type=SOCK_DGRAM;
else
Usage(argv[0]);
i++;
break;
case'n':
server_name=argv[++i];
case'e':
port=atoi(argv[++i]);
case'l':
loopflag=1;
if(argv[i+1]){
if(argv[i+1][0]!
='-')
maxloop=atoi(argv[i+1]);
maxloop=-1;
default:
if((retval=WSAStartup(0x202,&wsaData))!
=0)
fprintf(stderr,"Client:
WSAStartup()failedwitherror%d\n",retval);
return-1;
printf("Client:
WSAStartup()isOK.\n");
if(port==0)
if(isalpha(server_name[0]))
{//serveraddressisaname
hp=gethostbyname(server_name);
{//Convertnnn.nnnaddresstoausableone
addr=inet_addr(server_name);
hp=gethostbyaddr((char*)&addr,4,AF_INET);
if(hp==NULL)
Cannotresolveaddress\"%s\":
Error%d\n",server_name,WSAGetLastError());
gethostbyaddr()isOK.\n");
//Copytheresolvedinformationintothesockaddr_instructure
memset(&server,0,sizeof(server));
memcpy(&(server.sin_addr),hp->h_addr,hp->h_length);
server.sin_family=hp->h_addrtype;
server.sin_port=htons(port);
conn_socket=socket(AF_INET,socket_type,0);/*Openasocket*/
if(conn_socket<0)
ErrorOpeningsocket:
Error%d\n",WSAGetLastError());
socket()isOK.\n");
Clientconnectingto:
%s.\n",hp->h_name);
if(connect(conn_socket,(structsockaddr*)&server,sizeof(server))==SOCKET_ERROR)
connect()failed:
%d\n",WSAGetLastError());
connect()isOK.\n");
//Testsendingsomestring
loopcount=0;
while
(1)
wsprintf(Buffer,"Thisisatestmessagefromclient#%d",loopcount++);
retval=send(conn_socket,Buffer,sizeof(Buffer),0);
if(retval==SOCKET_ERROR)
send()failed:
error%d.\n",WSAGetLastError());
send()isOK.\n");
Sentdata\"%s\"\n",Buffer);
retval=recv(conn_socket,Buffer,sizeof(Buffer),0);
recv()failed:
closesocket(conn_socket);
recv()isOK.\n");
//WearenotlikelytoseethiswithUDP,sincethereisno
//'connection'established.
if(retval==0)
Serverclosedconnection.\n");
Received%dbytes,data\"%s\"fromserver.\n",retval,Buffer);
loopflag)
Terminatingconnection...\n");
if((loopcount>=maxloop)&&(maxloop>0))
return0;
Server端源码:
//defaultTCPsockettype
%s-p[protocol]-e[port_num]-i[ip_address]\n",progname);
\n\t-protocolisoneofTCPorUDP\n");
fprintf(stderr,"\t-ip_addressistheipaddress(indotted\n");
fprintf(stderr,"\tdecimalnotation)tobindto.Butitisnotusefulhere...\n");
fprintf(stderr,"\t-HitCtrl-Ctoterminateserverprogram...\n");
fprintf(stderr,"\t-ThedefaultsareTCP,2007andINADDR_ANY.\n");
char*ip_address=NULL;
intretval;
intfromlen;
inti;
structsockaddr_inlocal,from;
SOCKETlisten_socket,msgsock;
/*Parsearguments,ifthereareargumentssupplied*/
for(i=1;i{//switchesoroptions...if((argv[i][0]=='-')||(argv[i][0]=='/')){//Changetolower...ifanyswitch(tolower(argv[i][1])){//if-por/pcase'p':if(!stricmp(argv[i+1],"TCP"))socket_type=SOCK_STREAM;elseif(!stricmp(argv[i+1],"UDP"))socket_type=SOCK_DGRAM;elseUsage(argv[0]);i++;break;//if-ior/i,forserveritisnotsouseful...case'i':ip_address=argv[++i];break;//if-eor/ecase'e':port=atoi(argv[++i]);break;//Nomatch...default:Usage(argv[0]);break;}}elseUsage(argv[0]);}}//RequestWinsockversion2.2if((retval=WSAStartup(0x202,&wsaData))!=0){fprintf(stderr,"Server:WSAStartup()failedwitherror%d\n",retval);WSACleanup();return-1;}elseprintf("Server:WSAStartup()isOK.\n");if(port==0){Usage(argv[0]);}local.sin_family=AF_INET;local.sin_addr.s_addr=(!ip_address)?INADDR_ANY:inet_addr(ip_address);/*PortMUSTbeinNetworkByteOrder*/local.sin_port=htons(port);//TCPsocketlisten_socket=socket(AF_INET,socket_type,0);if(listen_socket==INVALID_SOCKET){fprintf(stderr,"Server:socket()failedwitherror%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:socket()isOK.\n");//bind()associatesalocaladdressandportcombinationwiththesocketjustcreated.//Thisismostusefulwhentheapplicationisa//serverthathasawell-knownportthatclientsknowaboutinadvance.if(bind(listen_socket,(structsockaddr*)&local,sizeof(local))==SOCKET_ERROR){fprintf(stderr,"Server:bind()failedwitherror%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:bind()isOK.\n");//Sofar,everythingwedidwasapplicabletoTCPaswellasUDP.//However,therearecertainstepsthatdonotworkwhentheserveris//usingUDP.Wecannotlisten()onaUDPsocket.if(socket_type!=SOCK_DGRAM){if(listen(listen_socket,5)==SOCKET_ERROR){fprintf(stderr,"Server:listen()failedwitherror%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:listen()isOK.\n");}printf("Server:%s:I'mlisteningandwaitingconnection\nonport%d,protocol%s\n",argv[0],port,(socket_type==SOCK_STREAM)?"TCP":"UDP");while(1){fromlen=sizeof(from);//accept()doesn'tmakesenseonUDP,sincewedonotlisten()if(socket_type!=SOCK_DGRAM){msgsock=accept(listen_socket,(structsockaddr*)&from,&fromlen);if(msgsock==INVALID_SOCKET){fprintf(stderr,"Server:accept()error%d\n",WSAGetLastError());WSACleanup();return-1;}elseprintf("Server:accept()isOK.\n");printf("Server:acceptedconnectionfrom%s,port%d\n",inet_ntoa(from.sin_addr),htons(from.sin_port));}elsemsgsock=listen_socket;//InthecaseofSOCK_STREAM,theservercandorecv()andsend()on//theacceptedsocketandthencloseit.//However,forSOCK_DGRAM(UDP),theserverwilldorecvfrom()andsendto()inaloop.if(socket_type!=SOCK_DGRAM)retval=recv(msgsock,Buffer,sizeof(Buffer),0);else{retval=recvfrom(msgsock,Buffer,sizeof(Buffer),0,(structsockaddr*)&from,&fromlen);printf("Server:Receiveddatagramfrom%s\n",inet_ntoa(from.sin_addr));}if(retval==SOCKET_ERROR){fprintf(stderr,"Server:recv()failed:error%d\n",WSAGetLastError());closesocket(msgsock);continue;}elseprintf("Server:recv()isOK.\n");if(retval==0){printf("Server:Clientclosedconnection.\n");closesocket(msgsock);continue;}printf("Server:Received%dbytes,data\"%s\"fromclient\n",retval,Buffer);printf("Server:Echoingthesamedatabacktoclient...\n");if(socket_type!=SOCK_DGRAM)retval=send(msgsock,Buffer,
//switchesoroptions...
//Changetolower...ifany
//if-por/p
//if-ior/i,forserveritisnotsouseful...
case'i':
ip_address=argv[++i];
//if-eor/e
//Nomatch...
//RequestWinsockversion2.2
fprintf(stderr,"Server:
printf("Server:
local.sin_family=AF_INET;
local.sin_addr.s_addr=(!
ip_address)?
INADDR_ANY:
inet_addr(ip_address);
/*PortMUSTbeinNetworkByteOrder*/
local.sin_port=htons(port);
//TCPsocket
listen_socket=socket(AF_INET,socket_type,0);
if(listen_socket==INVALID_SOCKET){
socket()failedwitherror%d\n",WSAGetLastError());
//bind()associatesalocaladdressandportcombinationwiththesocketjustcreated.
//Thisismostusefulwhentheapplicationisa
//serverthathasawell-knownportthatclientsknowaboutinadvance.
if(bind(listen_socket,(structsockaddr*)&local,sizeof(local))==SOCKET_ERROR)
bind()failedwitherror%d\n",WSAGetLastError());
bind()isOK.\n");
//Sofar,everythingwedidwasapplicabletoTCPaswellasUDP.
//However,therearecertainstepsthatdonotworkwhentheserveris
//usingUDP.Wecannotlisten()onaUDPsocket.
if(socket_type!
=SOCK_DGRAM)
if(listen(listen_socket,5)==SOCKET_ERROR)
listen()failedwitherror%d\n",WSAGetLastError());
listen()isOK.\n");
%s:
I'mlisteningandwaitingconnection\nonport%d,protocol%s\n",argv[0],port,(socket_type==SOCK_STREAM)?
"TCP":
"UDP");
fromlen=sizeof(from);
//accept()doesn'tmakesenseonUDP,sincewedonotlisten()
msgsock=accept(listen_socket,(structsockaddr*)&from,&fromlen);
if(msgsock==INVALID_SOCKET)
accept()error%d\n",WSAGetLastError());
accept()isOK.\n");
acceptedconnectionfrom%s,port%d\n",inet_ntoa(from.sin_addr),htons(from.sin_port));
msgsock=listen_socket;
//InthecaseofSOCK_STREAM,theservercandorecv()andsend()on
//theacceptedsocketandthencloseit.
//However,forSOCK_DGRAM(UDP),theserverwilldorecvfrom()andsendto()inaloop.
retval=recv(msgsock,Buffer,sizeof(Buffer),0);
retval=recvfrom(msgsock,Buffer,sizeof(Buffer),0,(structsockaddr*)&from,&fromlen);
Receiveddatagramfrom%s\n",inet_ntoa(from.sin_addr));
error%d\n",WSAGetLastError());
closesocket(msgsock);
continue;
Clientclosedconnection.\n");
Received%dbytes,data\"%s\"fromclient\n",retval,Buffer);
Echoingthesamedatabacktoclient...\n");
retval=send(msgsock,Buffer,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1