TCp/IP实验一
2016-03-05 14:18
399 查看
tcpip作业1:
作业要求:基于TCP的客户/服务器通信程序,实现交互式聊天,并带有退出功能。
client
server:
作业要求:基于TCP的客户/服务器通信程序,实现交互式聊天,并带有退出功能。
client
//client #include<Winsock2.h> #include<stdio.h> //服务器端口号为5050 #define DEFAULT_PORT 5050 #define DATA_BUFFER 1024 #define N 100 WSADATA wsaData; SOCKET sClient,sClient1; int iPort=DEFAULT_PORT; int iLen; char buf[DATA_BUFFER],buf1[DATA_BUFFER]; struct sockaddr_in ser,ser1; void connect() { if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("Winsockload failed\n"); return; } ser.sin_family=AF_INET; ser.sin_port=htons(iPort); ser.sin_addr.s_addr=inet_addr("127.0.0.1"); sClient=socket(AF_INET,SOCK_STREAM,0); if(sClient==INVALID_SOCKET) { printf("scoket()failed:%d\n",WSAGetLastError()); return; } if(connect(sClient,(struct sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET) { printf("connect()failed:%d\n",WSAGetLastError()); return; } else { iLen=recv(sClient,buf,sizeof(buf),0); if(iLen==0) return; else if(iLen==SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError()); return; } printf("recv()datafromserver:%s\n",buf); } ser1.sin_family=AF_INET; ser1.sin_port=htons(iPort); ser1.sin_addr.s_addr=inet_addr("172.18.148.101"); sClient1=socket(AF_INET,SOCK_STREAM,0); if(sClient1==INVALID_SOCKET) { printf("scoket()failed:%d\n",WSAGetLastError()); return; } if(connect(sClient1,(struct sockaddr*)&ser1,sizeof(ser1))==INVALID_SOCKET) { printf("connect()failed:%d\n",WSAGetLastError()); return; } else { iLen=recv(sClient1,buf1,sizeof(buf1),0); if(iLen==0) return; else if(iLen==SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError()); return; } printf("recv()datafromserver:%s\n",buf); } printf("开始聊天吧!\n"); } void connectOne() { if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) { printf("Winsockload failed\n"); return; } ser1.sin_family=AF_INET; ser1.sin_port=htons(iPort); ser1.sin_addr.s_addr=inet_addr("172.18.148.101"); sClient1=socket(AF_INET,SOCK_STREAM,0); if(sClient1==INVALID_SOCKET) { printf("scoket()failed:%d\n",WSAGetLastError()); return; } if(connect(sClient1,(struct sockaddr*)&ser1,sizeof(ser1))==INVALID_SOCKET) { printf("connect()failed:%d\n",WSAGetLastError()); return; } else { iLen=recv(sClient1,buf1,sizeof(buf1),0); if(iLen==0) return; else if(iLen==SOCKET_ERROR) { printf("recv()failed:%d\n",WSAGetLastError()); return; } printf("recv()datafromserver:%s\n",buf); } } bool quit(char a ) { char c; if(a[0]=='q'&&a[1]=='u'&&a[2]=='i'&&a[3]=='t') { printf("server disconnected! "); printf("reconnect? <y/n>: "); scanf("%d",c); if(c=='y'||c=='Y') { connectOne(); return false; } else return true; } return false; } void main(int argc,char *argv[ ]){ /* WSADATA wsaData; SOCKET sClient; int iPort= DEFAULT_PORT; //从服务器端接收的数据长度 int iLen; //接收数据的缓冲 char buf[DATA_BUFFER]; //服务器端地址 struct sockaddr_in ser; //判断输入的参数是否正确 if(argc<2){ //提示在命令行中输入服务器IP地址 printf("Usage:client [server IP address]\n"); return; } //接收数据的缓冲区初始化 memset(buf,0,sizeof(buf)); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){ printf("Failed to load Winsock.\n"); return; } //填写要连接的服务器地址信息 ser.sin_family=AF_INET; ser.sin_port=htons(iPort); //inet_addr( )函数将命令行的点分IP地址转化为用二进制表示的网络字节顺序的IP地址 ser.sin_addr.s_addr=inet_addr(argv[1]); //建立客户端流式套接口 sClient=socket(AF_INET,SOCK_STREAM,0); if(sClient==INVALID_SOCKET){ printf("socket( ) Failed:%d\n", WSAGetLastError( )); return; } //请求与服务器端建立TCP连接 if(connect(sClient,(struct sockaddr*)&ser,sizeof(ser))==INVALID_SOCKET){ printf("connect( ) Failed:%d\n", WSAGetLastError( )); return; } else{ //从服务器端接收数据 iLen=recv(sClient,buf,sizeof(buf),0); if(iLen==0) return; else if(iLen==SOCKET_ERROR){ printf("recv( ) Failed:%d\n", WSAGetLastError( )); return; } printf("recv( ) data from server:%s\n",buf); } while(1) { iLen=recv(sClient,buf,sizeof(buf),0); if(iLen==0) return; else if(iLen==SOCKET_ERROR){ printf("recv( ) Failed:%d\n", WSAGetLastError( )); return; } printf("recv( ) data from server:%s\n",buf); } closesocket(sClient); WSACleanup( );*/ memset(buf,0,sizeof(buf)); connect(); while(1) { char talk ; gets(talk); if(talk[0]!=NULL) { if(talk[0]=='q'&&talk[1]=='u'&&talk[2]=='i'&&talk[3]=='t') send(sClient1, talk, strlen(talk)+1, 0); else { send(sClient, talk, strlen(talk)+1, 0); send(sClient1, talk, strlen(talk)+1, 0); } } if(quit(talk)) break; } closesocket(sClient); printf("link stopped\n"); WSACleanup(); }
server:
#include<Winsock2.h> #include<stdio.h> #include<stdlib.h> //服务器使用的端口号为5050 #define DEFAULT_PORT 5050 #define N 100 bool quit(char a ) { if(a[0]=='q'&&a[1]=='u'&&a[2]=='i'&&a[3]=='t') return true; return false; } void main(){ int iPort=DEFAULT_PORT; WSADATA wsaData; SOCKET sListen,sAccept,sAccept1; //客户地址长度 int iLen,iLen1; //发送的数据长度 int iSend; //要发送给客户的信息 char buf[ ]="Hello!I am a server."; //服务器和客户的地址 struct sockaddr_in ser,cli,cli1; printf("-------------------------------\n"); printf("Server waiting\n"); printf("-------------------------------\n"); if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){ printf("Failed to load Winsock.\n "); return; } //创建服务器端套接口 sListen=socket(AF_INET,SOCK_STREAM,0); if(sListen==INVALID_SOCKET){ printf("socket( )Failed:%d\n", WSAGetLastError( )); return; } //以下建立服务器端地址 ser.sin_family=AF_INET; //htons( )函数把一个双字节主机字节顺序的数转换为网络字节顺序的数 ser.sin_port=htons(iPort); //htonl( )函数把一个四字节主机字节顺序的数转换为网络字节顺序的数 //使用系统指定的IP地址INADDR_ANY ser.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(sListen,(LPSOCKADDR)&ser,sizeof(ser))==SOCKET_ERROR){ printf("bind( ) Failed: %d\n", WSAGetLastError( )); return; } //进入监听状态 if(listen(sListen,5)==SOCKET_ERROR){ printf("listen( ) Failed:%d\n",WSAGetLastError( )); return; } //初始化客户地址长度参数 iLen=sizeof(cli); iLen1=sizeof(cli1); sAccept=accept(sListen,(struct sockaddr*)&cli,&iLen); if(sAccept==INVALID_SOCKET) { printf("accept() failed:%d\n",WSAGetLastError()); } printf("accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli.sin_addr),ntohs(cli.sin_port)); iSend=send(sAccept,buf,sizeof(buf),0); if(iSend==SOCKET_ERROR) { printf("send() failed:%d\n",WSAGetLastError()); } else { printf("send() byte:%d\n",send); printf("--------------------\n"); } sAccept1=accept(sListen,(struct sockaddr*)&cli1,&iLen1); if(sAccept1==INVALID_SOCKET) { printf("accept() failed:%d\n",WSAGetLastError()); } printf("accepted client IP:[%s],port:[%d]\n",inet_ntoa(cli1.sin_addr),ntohs(cli1.sin_port)); iSend=send(sAccept1,buf,sizeof(buf),0); if(iSend==SOCKET_ERROR) { printf("send() failed:%d\n",WSAGetLastError()); } else { printf("send() byte:%d\n",send); printf("--------------------\n"); } //进入一个无限循环,等待客户的连接请求 while(1){ do { char recvBuf ,recvBuf1 ; recv(sAccept1, recvBuf1,N, 0); if(quit(recvBuf1)) break; printf("李晓辉: "); printf("%s\n", recvBuf1); recv(sAccept, recvBuf,N, 0); if(quit(recvBuf)) break; printf("冯真: "); printf("%s\n", recvBuf); }while(1); printf("client disconnected!\n"); closesocket(sAccept); sAccept=accept(sListen,(struct sockaddr*)&cli,&iLen); if(sAccept==INVALID_SOCKET){ printf("accept( ) Failed: %d\n", WSAGetLastError( )); break; } //输出客户IP地址和端口号 printf("Accepted client IP:[%s],port:[%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port)); //给连接的客户发送信息 iSend=send(sAccept,buf,sizeof(buf),0); if(iSend==SOCKET_ERROR){ printf("send( ) Failed.:%d\n", WSAGetLastError( )); break; } else if(iSend==0) break; else{ printf("send( ) byte:%d\n",iSend); printf("-------------------------------\n"); } while(1){ scanf("%s",buf); iSend=send(sAccept,buf,sizeof(buf),0); if(iSend==SOCKET_ERROR) { printf("send( ) Failed.:%d\n", WSAGetLastError( )); break; } else if(iSend==0) break; else{ printf("send( ) byte:%d\n",iSend); printf("-------------------------------\n"); } } } while(1){ scanf("%s",buf); iSend=send(sAccept,buf,sizeof(buf),0); if(iSend==SOCKET_ERROR) { printf("send( ) Failed.:%d\n", WSAGetLastError( )); break; } else if(iSend==0) break; else{ printf("send( ) byte:%d\n",iSend); printf("-------------------------------\n"); } } closesocket(sListen); WSACleanup( ); }
相关文章推荐
- 自写网络流24题总结
- AFNetworking使用
- TCP/IP四层模型
- 网络端口
- Linux学习之路——网络基础知识点汇总
- 自定义BroadcastReceiver使用监听网络状态变化
- javax.servlet.http.HttpSession session用法详解
- HttpSession详解
- IHttpModule在webconfig中的注册
- IIS 多站点HTTPS加密及自动http跳转到https
- HTTP协议以及版本
- 卷积神经网络
- 2016太原网络营销师讲百度竞价(SEM)如何设计百度网盟账户?
- 一种网络用户行为日志自动获取方法
- 交叉编译tcpdump
- linux程序设计(套接字)+TCP/IP网络编程学习笔记
- 网络医院框架之我见
- TCP的三次握手和四次挥手
- 启动httpd报错
- tomcat下配置https环境