TCp/IP实验一

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[N])
{
    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[N];
        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[N])
{
    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[N],recvBuf1[N];  

            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( );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值