久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3409|回復: 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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美国产日韩一区二区三区 | www.中文字幕.com | 亚洲久草| 久久国产精品久久久久久 | 精品一区av | 欧美男人天堂 | 日本一区精品 | 日韩伦理一区二区 | 久久精品国产99国产精品 | 免费a v网站 | 国产人成在线观看 | 久久一| 国产美女网站 | 亚洲国产aⅴ精品 | 国产小u女发育末成年 | 精品一区av | 久久久久综合 | 欧美日韩电影免费观看 | 亚洲不卡在线视频 | 国产1区 | 精品福利在线 | 欧美成ee人免费视频 | 中文字幕二区 | 国产网站在线播放 | 亚洲一区二区精品视频 | 欧美精品国产一区二区 | www.99精品| 看a级黄色毛片 | 涩涩视频网站在线观看 | 免费在线观看h片 | 中文字幕一区二区不卡 | 亚洲va欧美va天堂v国产综合 | 日韩和的一区二区 | 九九热这里只有精品在线观看 | 欧美黄色一区 | 久婷婷| 亚洲视频中文字幕 | 国产精品视频久久久久 | 日日摸夜夜添夜夜添特色大片 | 午夜视频在线免费观看 | 日韩视频 中文字幕 |