您的位置:首页 > 理论基础 > 计算机网络

TCp/IP实验一

2016-03-05 14:18 399 查看
tcpip作业1:

作业要求:基于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( );
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: