TCPIP协议与网络编程期末大作业Word文档格式.docx
- 文档编号:18497418
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:8
- 大小:19.78KB
TCPIP协议与网络编程期末大作业Word文档格式.docx
《TCPIP协议与网络编程期末大作业Word文档格式.docx》由会员分享,可在线阅读,更多相关《TCPIP协议与网络编程期末大作业Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
intmain(intargc,char**argv){WSADATAwsaData;
sockaddr_inser,cli;
SOCKETsClient,wchysClient;
intiLen,wchyiLen;
intiRecv;
charsend_buf[1000];
charrecv_buf[BUFFER_SIZE];
if(WSAStartup(MAKEWORD(2,2),wsaData)!
=0){printf(“WSAStartup()\n“);
return0;
}printf(“手动连接模式中....\n“);
charszServer[256];
//连接的服务器地址,IP地址printf(“请输入即将连接的服务器IP地址:
“);
gets(szServer);
ser.sin_family=AF_INET;
ser.sin_port=htons(5050);
ser.sin_addr.s_addr=inet_addr(szServer);
charuser[20],password[20];
charstr[100],str1[100],wchystr[100];
boolhasLogin=false;
//只能绑定一次,开始放在了循环里,555wchysClient=socket(AF_INET,SOCK_DGRAM,0);
if(wchysClient==INVALID_SOCKET){printf(“socket()Faild:
%d\n“,WSAGetLastError());
}cli.sin_family=AF_INET;
cli.sin_port=htons(5053);
cli.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(wchysClient,(LPSOCKADDR)cli,sizeof(cli))==SOCKET_ERROR){printf(“bind()Faild:
}wchyiLen=sizeof(cli);
memset(recv_buf,0,sizeof(recv_buf));
sClient=socket(AF_INET,SOCK_STREAM,0);
if(sClient==INVALID_SOCKET){printf(“socket()\n“);
}if(connect(sClient,(sockaddr*)ser,sizeof(ser))==INVALID_SOCKET){printf(“socket()\n“);
}else{boolhasLogin=false;
while(!
hasLogin){printf(“--------------------------------\n“);
printf(“0.注册\n“);
printf(“1.登陆\n“);
printf(“2.退出\n“);
printf(“请输入相应的数字:
\nscanf(“%s“,str);
switch(str[0]){case'0':
printf(“用户名:
scanf(“%s“,user);
printf(“密码:
scanf(“%s“,password);
strcpy(send_buf,“0“);
strcat(send_buf,user);
strcat(send_buf,“@“);
strcat(send_buf,password);
MySendMessage(sClient,send_buf,sizeof(send_buf));
break;
case'1':
printf(“密码:
strcpy(send_buf,“1“);
iRecv=recvfrom(wchysClient,recv_buf,BUFFER_SIZE,0,(SOCKADDR*)cli,wchyiLen);
if(iRecv==SOCKET_ERROR){printf(“recvfrom()Faild:
}elseif(iRecv==0)break;
else{//接收到了正确数据printf(“recv:
%s\n“,recv_buf);
}if(recv_buf[0]=='@'recv_buf[1]=='@'){hasLogin=0;
system(“cls“);
printf(“登录失败!
请重新登录或注册后登录^_^\n“);
}if(recv_buf[0]=='*'recv_buf[1]=='*'){hasLogin=0;
printf(“已经在其他地方登陆\n“);
请重新选择用户登录或注册后登录^_^\n“);
}if(recv_buf[0]=='#'recv_buf[1]=='#'){hasLogin=1;
printf(“登录成功^_^\n“);
boolwchyhasLogin=false;
wchyhasLogin){printf(“--------------------------------\n“);
printf(“0.群聊\n“);
printf(“1.单聊\n“);
printf(“2.在线用户\n“);
printf(“3.退出\n“);
\nscanf(“%s“,wchystr);
switch(wchystr[0]){case'0':
wchyhasLogin=1;
printf(“输入exit退出。
\n“);
printf(“--------------------------------\n“);
while(wchyhasLogin){printf(“scanf(“%s“,str);
if(strcmp(str,“exit“)!
=0){strcpy(send_buf,“2“);
strcat(send_buf,str);
}else{system(“cls“);
wchyhasLogin=0;
}}break;
printf(“请输入单聊对象的用户名:
scanf(“%s“,str1);
strcpy(send_buf,“5“);
strcat(send_buf,str1);
strcat(send_buf,“*“);
strcat(send_buf,“__Welcome__To__Single__Chat...“);
else{//接收到了正确数据//printf(“recv:
}if(recv_buf[0]=='^'recv_buf[1]=='^'){wchyhasLogin=0;
printf(“单聊对象不存在,退出了单聊模式\n“);
}if(recv_buf[0]==''recv_buf[1]==''){wchyhasLogin=0;
printf(“单聊对象未在线,退出了单聊模式\n“);
}if(recv_buf[0]=='%'recv_buf[1]=='%'){printf(“输入exit退出。
=0){strcpy(send_buf,“5“);
}}}break;
case'2':
strcpy(send_buf,“4“);
case'3':
strcpy(send_buf,“3“);
hasLogin=0;
default:
printf(“请输入正确信息\n“);
exit(0);
printf(“请输入正确信息“);
}}}system(“PAUSE“);
closesocket(sClient);
WSACleanup();
}voidMySendMessage(SOCKETsSocket,char*response,intresponseLen){intiSend;
iSend=send(sSocket,response,responseLen,0);
if(iSend==SOCKET_ERROR){printf(“send()Failed.:
}elseif(iSend==0);
else{//printf(“send()succeeded!
printf(“----------------------\n“);
}}2.2接收端设计2.21流程图2.22代码#includestdlib.h#includestring.h//formain.cpp(1.cpp)#defineDEFAULT_PORT5051//FORRECV#defineDEFAULT_PORTSEND5052//FORSEND#defineBUFFER_LENGTH1000constboolDebug=0;
#defineMaxUser1000//--------------------------------------------------------------------------------////当程序遇到异常而结束时会示出错误而退出//--------------------------------------------------------------------------------////成员结构信息#defineUserNameLen200#definePasswordLen200typedefstruct{charUserName[200];
charPassword[200];
boolLog;
//是否登陆charIp[20];
}UserData;
#definethefile“config.txt“boolSaveData(UserData**userdata,intuserdatap);
//--------------------------------------------------------------------------------////初始化用户数据导入intfindUser(UserData**data,intnum,char*name){inti;
for(i=0;
i=num;
i++){if(strcmp(name,data[i]-UserName)==0)returni;
}return-1;
}voiddeal(char*str,UserData**data,intnum,char*response,char*ip){charUser[UserNameLen];
charPass[PasswordLen];
//第一位字符是功能号//0注册//1登陆//2会话//3退出inti,t;
if(str[0]=='0'){//注册的消息格式为0+name+@+passwordfor(i=1;
istrlen(str);
i++)if(str[i]=='@')break;
str[i]='\0';
strcpy(User,str+1);
strcpy(Pass,str+i+1);
t=findUser(data,num,User);
if(t==-1){//该用户名不存在,可以注册num++;
data[num]=(UserData*)malloc(sizeof(UserData));
if(data[num]==NULL){printf(“[+]ERROR:
mallocfailed\n“);
exit
(1);
}strcpy(data[num]-UserName,User);
strcpy(data[num]-Password,Pass);
data[num]-Log=0;
memset(data[num]-Ip,'\0',sizeof(data[num]-Ip));
printf(“%s用户注册成功\n“,User);
//--------------------------------------------------注册完成//返回成功信息strcpy(response,“00“);
//第一位是功能号第二位是状态号0表示成功1表示失败SaveData(data,num);
}else{//failprintf(“%s用户注册失败\n“,User);
//-----------------------------------------------注册失败strcpy(response,“01“);
}}elseif(str[0]=='1'){//登陆的消息格式为1+name+@+passwordfor(i=1;
//printf(“i=%d\n“,i);
if(t!
=-1){//找到该用户//printf(“Pass=%s“,Pass);
//printf(“Pawd=%s“,data[t]-Password);
if(strcmp(Pass,data[t]-Password)==0data[t]-Log==0){//密码验证成功printf(“%s登陆成功\n“,User);
data[t]-Log=1;
strcpy(data[t]-Ip,ip);
strcpy(response,“10“);
}elseif(strcmp(Pass,data[t]-Password)==0data[t]-Log==1){printf(“%s已经在其他地方登陆\n“,User);
strcpy(response,“1@“);
}else{printf(“%s登陆密码错误\n“,User);
strcpy(response,“11“);
}}else{printf(“%s用户不存在,登陆失败\n“,User);
strcpy(response,“12“);
}}elseif(str[0]=='2'){//会话的消息格式为2+'name'+'@'+'(message)'for(i=1;
=-1strcmp(data[t]-UserName,User)==0strcmp(data[t]-Ip,ip)==0){//表示确实是正确用户发来的会话strcpy(response,“20“);
strcat(response,User);
strcat(response,“:
strcat(response,str+i+1);
printf(“%s:
%s\n“,User,str+i+1);
}else{strcpy(response,“21“);
printf(“非正确用户发来会话,不予处理!
}}elseif(str[0]=='3'){//会话的消息格式为3+'name'+'@'+'(message)'for(i=1;
=-1strcmp(data[t]-UserName,User)==0strcmp(data[t]-Ip,ip)==0){//表示确实是正确用户发来的会话strcpy(response,“30“);
data[t]-Log=0;
memset(data[t]-Ip,'\0',sizeof(data[t]-Ip));
printf(“%s退出\n“,data[t]-UserName);
}else{strcpy(response,“31“);
}}elseif(str[0]=='4'){for(i=1;
strcpy(response,“40“);
i++){if(data[i]-Log==1){printf(“%s[%s]在线\n“,data[i]-UserName,data[i]-//printf(“%s\n“,data[i]-UserName);
strcat(response,data[i]-UserName);
strcat(response,““);
}else{//printf(“%s“,data[i]-}}}elseif(str[0]=='5'){for(i=1;
printf(“%s用户接收\n“,User);
for(i=1;
istrlen(Pass);
i++)if(Pass[i]=='*')break;
Pass[i]='\0';
printf(“%s用户发送\n“,Pass);
if(t==-1){strcpy(response,“60“);
printf(“单聊对象不存在“);
}else{if(data[t]-Log==0){strcpy(response,“61“);
printf(“%s未在线\n“,User);
}elseif(data[t]-Log==1){strcpy(response,“50“);
strcat(response,Pass);
strcat(response,Pass+i+1);
%s\n“,Pass,Pass+i+1);
printf(“%s在线,可进行聊天\n“,User);
}}}}voidMySendMessage(intsSocket,char*response,intresponseLen,SOCKADDR*cli,intcliLen){intiSend;
iSend=sendto(sSocket,response,responseLen,0,(SOCKADDR*)cli,cliLen);
if(iSend==SOCKET_ERROR){printf(“sendto()Failed.:
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TCPIP 协议 网络 编程 期末 作业