找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3459|回复: 0
收起左侧

C语言Socket实现主机与客户端异步通信 学习资料

[复制链接]
ID:381226 发表于 2018-7-31 11:59 | 显示全部楼层 |阅读模式
服务器端代码编写
#include <stdio.h>
#include <windows.h>
/***定义端口**/
#define PORT 8888
/***定义最大传输数据量**/
#define MAXDATA 100
/****在入口函数中输入主机IP地址****/
int main(int argc, char** argv)
{
    /*定义标志,接收到第一个client时,不在接收其他client*/
    int flag = 1;
    /*得到socket嵌套字*/
    SOCKET  server;
    /*定义发送消息的长度*/
    int sdMsgLen;
    /*启动windows的socket服务*/
    WSADATA wsaData;
    WSAStartup(0x101,&wsaData);
    char *CloseClient = "bye";
    char* CloseC_S = "byebye";

    /*定义receive数据长度*/
    int receive;
    int len;
    /*创建服务器*/
    struct sockaddr_in serveraddr;
    /*创建客户端*/
    struct sockaddr_in addrClient;
    /*将serveraddr置零*/
    memset((void*)&serveraddr,0,sizeof(serveraddr));
    /*定义家族协议*/
    serveraddr.sin_family = AF_INET;
    /*定义主机地址*/
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//);"192.168.1.100"
    /*定义主机端口*/
    serveraddr.sin_port = htons(PORT);
    /*得到socket嵌套字*/
    server = socket(AF_INET,SOCK_STREAM,0);
    /*返回值为-1,未启动windows的socket服务*/
    if(server==-1)
    {
        perror("socket error!");
    }
    /*绑定成功返回0*/
    if(bind(server,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) == -1)
    {
        perror("不能进行绑定!");
        exit(1);
    }
    /*定义客户端嵌套字*/
    SOCKET client;
    /*进入监听客户端连接和监听客户端发送的消息*/
    while(1)
    {
        /*定义并初始化接收数据的存储*/
        char receiveBuffer[MAXDATA] = "\n";
        /*定义并初始化发送数据存储*/
        char sendBuffer[MAXDATA] = "\n";
        /*采用异步发送消息*/
        bool sendFlag = false;
        /*监听客户端*/
        if(listen(server,20) == -1)
        {
            perror("不能进行监听!");
            exit(1);
        }
        /*接收到第一个用户后将其锁定,不在接收其他用户*/
        if(flag)
        {
            len = sizeof(struct sockaddr_in);
            /*得到客户端的嵌套字*/
            client = accept(server,(SOCKADDR*)&addrClient,&len);
            if(client == -1)
            {
                perror("accept error");
                continue;
            }
            printf("新连接: %s \n",inet_ntoa(addrClient.sin_addr));
            /*创建一个消息*/
            char* msg = "Hello,Connected Successfully!\n";
            int len = strlen(msg);
            /*得到send的返回值,返回为发送消息的长度.若发送失败则返回-1*/
            int sendLen = send(client,msg,len,0) ;
            if(sendLen == -1)
            {
                perror("消息发送失败!\n");
                closesocket(client);
            }
            msg=0;
            /*接收到第一个客户端,将其锁定*/
            flag = 0;
        }
        /*得到接收到消息的长度*/
        receive = recv(client,receiveBuffer,MAXDATA,0);
        /*若消息长度为-1,则接收数据失败*/
        if(receive == -1)
        {
            perror("接收出错!\n");
            /*关闭客户端*/
            closesocket(client);
        }
        
        printf("%s\n",receiveBuffer);
        /*测试客户端发送的结束通话标志*/
        if(strcmp(receiveBuffer,CloseClient) == 0)
        {
            printf("失去客户端:%s\n",inet_ntoa(addrClient.sin_addr));
            flag = 1;

            closesocket(client);
            
        }
        else if(strcmp(receiveBuffer,CloseC_S) == 0)
        {
            
            closesocket(server);
            exit(1);
        }
        else
        {
            printf("Client %s send message : %s\n",inet_ntoa(addrClient.sin_addr),receiveBuffer);
            /*当接收到消息后,服务器才可以发送消息*/
            sendFlag = true;
        }
        while(sendFlag)
        {
            printf("Your Message:");
            /*得到服务器输入的字符串*/
            scanf("%s",sendBuffer);
            sdMsgLen = strlen(sendBuffer);
            /*得到服务器发送消息的长度*/
            int sendLen = send(client,sendBuffer,sdMsgLen,0);
            if(sendLen == -1)
            {
                perror("消息发送失败!");
                closesocket(client);
            }
            /*结束服务器发送消息模式,改为接收模式*/
            sendFlag = false;
        }   
    }
   
    return 0;
}

客户端代码编写

#include <windows.h>
#include <stdio.h>
#include <errno.h>
/*定义与主机连接的端口*/
#define PORT 8888
/*定义最大传输数据量*/
#define MAXDATA 100
/*由入口函数得到需要连接主机的IP地址*/
int main(int ars,char** arg)
{
    /*开启windows的socket*/
    WSADATA wsaData;
    WSAStartup(0x101,&wsaData);
   
    /*定义服务器*/
    struct sockaddr_in serveraddr;
    /*将serveraddr清零*/
    memset((void*)&serveraddr,0,sizeof(serveraddr));
    /*定义家族协议*/
    serveraddr.sin_family = AF_INET;
    /*得到主机IP地址*/
    serveraddr.sin_addr.s_addr = inet_addr(arg[1]);//);//)"192.168.1.100";
    /*得到端口*/
    serveraddr.sin_port = htons(PORT);
    /*得到socket嵌套字*/
    SOCKET s = socket(AF_INET,SOCK_STREAM,0);
    /*
    *建立TCP连接
    *参数1:socket返回的描述符
    *参数2:主机IP地址和端口号指针
    *参数3:远端地质借口长度
    */
    if(connect(s,(struct sockaddr*)&serveraddr,sizeof(serveraddr)) == -1)
    {
        perror("连接错误!");
        exit(1);
    }
    /*进入监听服务器发送消息,采取异步通信*/
    while(1)
    {
        /*初始化接收和发送数据的存储*/
        char receiveBuffer[MAXDATA] = "\n";
        char sendBuffer[MAXDATA] = "\n";
        /*定发送模式*/
        bool sendFlag = false;
        /*如果接收数据位-1则接收错误,正确是recv返回接收到数据的长度*/
        if(recv(s,receiveBuffer,MAXDATA,0)==-1)
        {
            perror("接收数据错误!");
            exit(1);
        }
        
        printf("server %s send message: %s\n",inet_ntoa(serveraddr.sin_addr),receiveBuffer);
        /*发送模式*/
        sendFlag = true;
        while(sendFlag)
        {
            char* CloseClient = "bye";
            char* CloseC_S = "byebye";
            /*得到输入的数据*/
            printf("Your Message  :");
            scanf("%s",sendBuffer);
            if(strcmp(sendBuffer,CloseClient) == 0)
            {
                send(s,CloseClient,strlen(CloseClient),0);
               
                closesocket(s);
                exit(1);
            }
            else{
                /*得到发送数据的长度*/
                int sendLen = send(s,sendBuffer,strlen(sendBuffer),0);
                /*发送数据长度为-1时,发送失败*/
                if(sendLen == -1)
                {
                    perror("发送错误!");
                    closesocket(s);
                }
            }
            /*发送模式结束,进入接收模式*/
            sendFlag = false;
        }
        
        
    }
    return 0;
}

C语言Socket实现主机与客户端异步通信.doc

44.5 KB, 下载次数: 14, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表