找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3429|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語言Socket實(shí)現(xiàn)主機(jī)與客戶端異步通信 學(xué)習(xí)資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:381226 發(fā)表于 2018-7-31 11:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
服務(wù)器端代碼編寫
#include <stdio.h>
#include <windows.h>
/***定義端口**/
#define PORT 8888
/***定義最大傳輸數(shù)據(jù)量**/
#define MAXDATA 100
/****在入口函數(shù)中輸入主機(jī)IP地址****/
int main(int argc, char** argv)
{
    /*定義標(biāo)志,接收到第一個(gè)client時(shí),不在接收其他client*/
    int flag = 1;
    /*得到socket嵌套字*/
    SOCKET  server;
    /*定義發(fā)送消息的長度*/
    int sdMsgLen;
    /*啟動(dòng)windows的socket服務(wù)*/
    WSADATA wsaData;
    WSAStartup(0x101,&wsaData);
    char *CloseClient = "bye";
    char* CloseC_S = "byebye";

    /*定義receive數(shù)據(jù)長度*/
    int receive;
    int len;
    /*創(chuàng)建服務(wù)器*/
    struct sockaddr_in serveraddr;
    /*創(chuàng)建客戶端*/
    struct sockaddr_in addrClient;
    /*將serveraddr置零*/
    memset((void*)&serveraddr,0,sizeof(serveraddr));
    /*定義家族協(xié)議*/
    serveraddr.sin_family = AF_INET;
    /*定義主機(jī)地址*/
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);//);"192.168.1.100"
    /*定義主機(jī)端口*/
    serveraddr.sin_port = htons(PORT);
    /*得到socket嵌套字*/
    server = socket(AF_INET,SOCK_STREAM,0);
    /*返回值為-1,未啟動(dòng)windows的socket服務(wù)*/
    if(server==-1)
    {
        perror("socket error!");
    }
    /*綁定成功返回0*/
    if(bind(server,(struct sockaddr *)&serveraddr,sizeof(serveraddr)) == -1)
    {
        perror("不能進(jìn)行綁定!");
        exit(1);
    }
    /*定義客戶端嵌套字*/
    SOCKET client;
    /*進(jìn)入監(jiān)聽客戶端連接和監(jiān)聽客戶端發(fā)送的消息*/
    while(1)
    {
        /*定義并初始化接收數(shù)據(jù)的存儲(chǔ)*/
        char receiveBuffer[MAXDATA] = "\n";
        /*定義并初始化發(fā)送數(shù)據(jù)存儲(chǔ)*/
        char sendBuffer[MAXDATA] = "\n";
        /*采用異步發(fā)送消息*/
        bool sendFlag = false;
        /*監(jiān)聽客戶端*/
        if(listen(server,20) == -1)
        {
            perror("不能進(jìn)行監(jiān)聽!");
            exit(1);
        }
        /*接收到第一個(gè)用戶后將其鎖定,不在接收其他用戶*/
        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));
            /*創(chuàng)建一個(gè)消息*/
            char* msg = "Hello,Connected Successfully!\n";
            int len = strlen(msg);
            /*得到send的返回值,返回為發(fā)送消息的長度.若發(fā)送失敗則返回-1*/
            int sendLen = send(client,msg,len,0) ;
            if(sendLen == -1)
            {
                perror("消息發(fā)送失敗!\n");
                closesocket(client);
            }
            msg=0;
            /*接收到第一個(gè)客戶端,將其鎖定*/
            flag = 0;
        }
        /*得到接收到消息的長度*/
        receive = recv(client,receiveBuffer,MAXDATA,0);
        /*若消息長度為-1,則接收數(shù)據(jù)失敗*/
        if(receive == -1)
        {
            perror("接收出錯(cuò)!\n");
            /*關(guān)閉客戶端*/
            closesocket(client);
        }
        
        printf("%s\n",receiveBuffer);
        /*測(cè)試客戶端發(fā)送的結(jié)束通話標(biāo)志*/
        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);
            /*當(dāng)接收到消息后,服務(wù)器才可以發(fā)送消息*/
            sendFlag = true;
        }
        while(sendFlag)
        {
            printf("Your Message:");
            /*得到服務(wù)器輸入的字符串*/
            scanf("%s",sendBuffer);
            sdMsgLen = strlen(sendBuffer);
            /*得到服務(wù)器發(fā)送消息的長度*/
            int sendLen = send(client,sendBuffer,sdMsgLen,0);
            if(sendLen == -1)
            {
                perror("消息發(fā)送失敗!");
                closesocket(client);
            }
            /*結(jié)束服務(wù)器發(fā)送消息模式,改為接收模式*/
            sendFlag = false;
        }   
    }
   
    return 0;
}

客戶端代碼編寫

#include <windows.h>
#include <stdio.h>
#include <errno.h>
/*定義與主機(jī)連接的端口*/
#define PORT 8888
/*定義最大傳輸數(shù)據(jù)量*/
#define MAXDATA 100
/*由入口函數(shù)得到需要連接主機(jī)的IP地址*/
int main(int ars,char** arg)
{
    /*開啟windows的socket*/
    WSADATA wsaData;
    WSAStartup(0x101,&wsaData);
   
    /*定義服務(wù)器*/
    struct sockaddr_in serveraddr;
    /*將serveraddr清零*/
    memset((void*)&serveraddr,0,sizeof(serveraddr));
    /*定義家族協(xié)議*/
    serveraddr.sin_family = AF_INET;
    /*得到主機(jī)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連接
    *參數(shù)1:socket返回的描述符
    *參數(shù)2:主機(jī)IP地址和端口號(hào)指針
    *參數(shù)3:遠(yuǎn)端地質(zhì)借口長度
    */
    if(connect(s,(struct sockaddr*)&serveraddr,sizeof(serveraddr)) == -1)
    {
        perror("連接錯(cuò)誤!");
        exit(1);
    }
    /*進(jìn)入監(jiān)聽服務(wù)器發(fā)送消息,采取異步通信*/
    while(1)
    {
        /*初始化接收和發(fā)送數(shù)據(jù)的存儲(chǔ)*/
        char receiveBuffer[MAXDATA] = "\n";
        char sendBuffer[MAXDATA] = "\n";
        /*定發(fā)送模式*/
        bool sendFlag = false;
        /*如果接收數(shù)據(jù)位-1則接收錯(cuò)誤,正確是recv返回接收到數(shù)據(jù)的長度*/
        if(recv(s,receiveBuffer,MAXDATA,0)==-1)
        {
            perror("接收數(shù)據(jù)錯(cuò)誤!");
            exit(1);
        }
        
        printf("server %s send message: %s\n",inet_ntoa(serveraddr.sin_addr),receiveBuffer);
        /*發(fā)送模式*/
        sendFlag = true;
        while(sendFlag)
        {
            char* CloseClient = "bye";
            char* CloseC_S = "byebye";
            /*得到輸入的數(shù)據(jù)*/
            printf("Your Message  :");
            scanf("%s",sendBuffer);
            if(strcmp(sendBuffer,CloseClient) == 0)
            {
                send(s,CloseClient,strlen(CloseClient),0);
               
                closesocket(s);
                exit(1);
            }
            else{
                /*得到發(fā)送數(shù)據(jù)的長度*/
                int sendLen = send(s,sendBuffer,strlen(sendBuffer),0);
                /*發(fā)送數(shù)據(jù)長度為-1時(shí),發(fā)送失敗*/
                if(sendLen == -1)
                {
                    perror("發(fā)送錯(cuò)誤!");
                    closesocket(s);
                }
            }
            /*發(fā)送模式結(jié)束,進(jìn)入接收模式*/
            sendFlag = false;
        }
        
        
    }
    return 0;
}

C語言Socket實(shí)現(xiàn)主機(jī)與客戶端異步通信.doc

44.5 KB, 下載次數(shù): 14, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表