华科 计算机网络 实验报告1Word文档下载推荐.docx
《华科 计算机网络 实验报告1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《华科 计算机网络 实验报告1Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
3.实验内容与结果
2.修改simplex-talk程序,编制duplex-talk程序,支持client和server的双向通信
(1)程序整体功能
Client端程序连接Server端程序,Client能给Server发送信息,同时Server也能给Client发送信息,实现双向通信;
(2)程序组成及各模块/函数功能
Client端
Y
N
Server
(3)程序清单(见附件)
(4)程序的运行和测试结果
编译源文件,生成可执行文件并运行,其过程如下:
Socket端
server.exe
[simplex-talkserver]serverisreadyinlistening...
client.exelocalhost
[simplex-talkserver]receivedaconnectionfrom127.0.0.1:
[simplex-talkclient]connectiontolocalhostisready
[simplex-talkclient]pleaseinputyourmessage(emptyinputtohalt):
Hello,Server.
[simplex-talkclient]send14charstoserver
[simplex-talkserver]received14chars
Hello,Client.
[simplex-talkserver]send14charstoclient
[simplex-talkclient]received14chars
Bye.
[simplex-talkclient]send5charstoserver
[simplex-talkserver]received5chars
[simplex-talkserver]emptymessageissendtoclient
[simplex-talkserver]connectionfrom127.0.0.1isterminated
[simplex-talkclient]emptymessageisreceived
[simplex-talkclient]connectionisterminated
运行结果截图
Client
4.实验中的问题
暂无
附件
1.
程序源代码
(1)socket-client.c
[键入文档的引述或关注点的摘要。
您可将文本框放置在文档中的任何位置。
请使用“绘图工具”选项卡更改引言文本框的格式。
]
/*wliucomments:
requiredforwindowssocketprogramming*/
#include<
winsock.h>
#pragmacomment(lib,"
wsock32.lib"
)
stdio.h>
string.h>
#defineSERVER_PORT5432
#defineMAX_BUFSIZE256
intmain(intargc,char*argv[])
{
/*wliucomments:
WSADATAWSAData;
intWSAreturn;
uselesspointer*/
//FILE*fp;
structhostent*hp;
structsockaddr_insin;
char*host;
charbufIn[MAX_BUFSIZE],bufOut[MAX_BUFSIZE];
ints,new_s;
intlen;
intableToSendMsg=1;
//LimWugcomments:
Thisvariableactsasaflagtosendandreceivemessage
host="
localhost"
;
//if(argc==2){
//host=argv[1];
//}
//else{
//fprintf(stderr,"
usage:
simplex-talkhost\n"
);
//exit
(1);
modifiedforwindowssocketprogramming*/
WSAreturn=WSAStartup(0x101,&
WSAData);
if(WSAreturn)
{
fprintf(stderr,"
simplex-talk:
WSAerror.\n"
exit
(1);
}
/*translatehostnameintopeer'
sIPaddress*/
hp=gethostbyname(host);
if(!
hp){
unknownhost:
%s\n"
host);
modifiedforstringmemoryoperationinwindows*/
//bzero((char*)&
sin,sizeof(sin));
//bcopy(hp->
h_addr,(char*)&
sin.sin_addr,hp->
h_length);
/*buildaddressdatastructure*/
memset((char*)&
sin,0,sizeof(sin));
memcpy((char*)&
h_addr,hp->
sin.sin_family=AF_INET;
sin.sin_port=htons(SERVER_PORT);
/*activeopen*/
if((s=socket(PF_INET,SOCK_STREAM,0))<
0){
perror("
socketfailed."
if(connect(s,(structsockaddr*)&
sin,sizeof(sin))<
connectfailed."
/*wliucomments:
//close(s);
closesocket(s);
}
displayingcurrentstatus*/
printf("
[simplex-talkclient]connectionto%sisready\n"
\n"
modificationtosupportconnectiontermination*/
//while(fgets(buf,sizeof(buf),stdin)){
/*mainloop:
getandsendlinesoftext*/
while
(1){
if(ableToSendMsg){
//LimWugcomments:
SendMessgage
fgets(bufIn,sizeof(bufIn),stdin);
/*wliucomments:
modifiedtostopsending*/
if(strlen(bufIn)==1){
/*wliucomments:
userinputemptymessagewith'
\n'
*/
bufIn[0]='
\0'
send(s,bufIn,1,0);
printf("
[simplex-talkclient]emptymessageissendtoserver\n"
break;
}else{
bufIn[MAX_BUFSIZE-1]='
len=strlen(bufIn)+1;
send(s,bufIn,len,0);
[simplex-talkclient]send%dcharstoserver\n\n"
strlen(bufIn));
ableToSendMsg=0;
}
}
else{
ReceiveMessage
len=recv(s,bufOut,sizeof(bufOut),0);
///*wliucomments:
if(strlen(bufOut)==0){
receivedemptymessage*/
[simplex-talkclient]emptymessageisreceived\n"
[simplex-talkclient]received%dchars\n"
strlen(bufOut));
fputs(bufOut,stdout);
ableToSendMsg=1;
}
[simplex-talkclient]connectionisterminated\n"
WSACleanup();
return1;
Socket-server.c
/*---------------------------------------------------*/
//filename:
socket-server.c
//fileuseage:
demostratethebasicTCP-basedblocked
//socketprogramminginwindowssystem
//fileorigin:
demoofsimplex-talk
//computernetworks,systemapproach,4th
//modifiedbyWeiLiu,06/12/2011
//modifiedbyLimWug,03/21/2012
requiredforlinuxsocketprogramming*/
//#include<
sys/types.h>
sys/socket.h>
netinet/in.h>
netdb.h>
#defineMAX_PENDING5
#defineMAX_CONNECTION3
intmain()
intableToSendMsg=0;
connections*/
intconn;
sin.sin_addr.s_addr=INADDR_ANY;
/*setuppassiveopen*/
if((bind(s,(structsockaddr*)&
sin,sizeof(sin)))<
bindfailed."
listen(s,MAX_PENDING);
[simplex-talkserver]serverisreadyinlistening...\n"
/*waitforconnection,thenreceiveandprinttext*/
conn=0;
while(conn<
MAX_CONNECTION){
correctionforvariablelen*/
len=sizeof(structsockaddr_in);
if((new_s=accept(s,(structsockaddr*)&
sin,&
len))<
0){
perror("
acceptfailed."
exit
(1);
[simplex-talkserver]receivedaconnectionfrom%s:
\n"
inet_ntoa(sin.sin_addr));
//while(len=recv(new_s,buf,sizeof(buf),0)){
while
(1){
if(ableToSendMsg){
//LimWugcomments:
fgets(bufIn,sizeof(bufIn),stdin);
if(strlen(bufIn)==1){
/*wliucomments:
bufIn[0]='
send(new_s,bufIn,1,0);
printf("
[simplex-talkserver]emptymessageissendtoclient\n"
break;
}else{
bufIn[MAX_BUFSIZE-1]='
len=strlen(bufIn)+1;
send(new_s,bufIn,len,0);
[simplex-talkserver]send%dcharstoclient\n\n"
ableToSendMsg=0;
}
else{
len=recv(new_s,bufOut,sizeof(bufOut),0);
if(strlen(bufOut)==0){
[simplex-talkserver]emptymessageisreceived\n"
[simplex-talkserver]received%dchars\n"
fputs(bufOut,stdout);
ableToSendMsg=1;
}
printf("
[simplex-talkserver]connectionfrom%sisterminated\n"
//close(new_s);
closesocket(new_s);
conn++;
[simplex-talkserver]max_connectionsachieved,serverhalt\n"