作业-11.22
创始人
2024-02-08 08:34:09

1、TCP服务器和客户端交互

        服务器

#include
#include
#include
#include
#include
#include
#include

#define ERR_MSG(msg) do{\
    fprintf(stderr, "__%d__", __LINE__);\
    perror(msg);\
}while(0)

#define PORT 6666
#define IP "192.168.31.111"


int main(int argc, const char *argv[])
{
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }

    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse ,sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("允许端口快速重用\n");

    struct sockaddr_in sin;
    sin.sin_family         = AF_INET;
    sin.sin_port         = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(IP);

    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }

    if(listen(sfd, 128) < 0)
    {
        ERR_MSG("listen");
        return -1;
    }
    printf("服务器监听成功\n");

    struct sockaddr_in cin;
    socklen_t addrlen = sizeof(cin);

    int newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);
    if(newfd < 0)
    {
        ERR_MSG("newfd");
        return -1;
    }
    printf("newfd = %d link successful!\n", newfd);


    ssize_t res = 0;
    char buf[128] = "";
    while(1)
    {
        bzero(buf, sizeof(buf));

        res = recv(newfd, buf, sizeof(buf), 0);
        if(res < 0)
        {
            ERR_MSG("recv");
            return -1;
        }
        else if(!res)
        {
            printf("newfd = %d link close!\n", newfd);
            break;
        }

        printf("res:%ld, newfd:%d : %s\n", res, newfd, buf);

        strcat(buf, "*_*");
        if(send(newfd, buf, sizeof(buf), 0) < 0)
        {
            ERR_MSG("sen");
            return -1;
        }
        printf("send success\n");
    }

    close(newfd);
    close(sfd);

    return 0;
}

        客户端

#include
#include
#include
#include
#include
#include
#include

#define ERR_MSG(msg) do{\
    fprintf(stderr, "__%d__:", __LINE__);\
    perror(msg);\
}while(0)


#define CLI_PORT 6656
#define CLI_IP     "192.168.31.111"

#define SER_PORT 8888
#define SER_IP     "192.168.31.111"

int main(int argc, const char *argv[])
{
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }

    struct sockaddr_in sin;
    sin.sin_family      = AF_INET;      
    sin.sin_port        = htons(SER_PORT);  
    sin.sin_addr.s_addr = inet_addr(SER_IP);

    if(connect(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("connect");
        return -1;
    }
    printf("connect success\n");


    ssize_t res = 0;
    char buf[128] = "";
    
    while(1)
    {
        bzero(buf, sizeof(buf));
        //发送
        printf("请输入>>>");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf)-1] = 0;
        
        if(0 == strcmp("quit", buf))
        {
            printf("客户端退出\n");
            break;
        }

        if(send(sfd, buf, sizeof(buf), 0) < 0)
        {
            ERR_MSG("sen");
            return -1;
        }
        printf("send success\n");

        //接收
        res = recv(sfd, buf, sizeof(buf), 0);
        if(res < 0)
        {
            ERR_MSG("recv");
            return -1;
        }
        else if(0 == res)
        {
            printf("服务器断开连接\n");
            break;
        }
        printf(":%s\n", buf);

    }

    close(sfd);    

    return 0;
}

 

 

2、UDP服务器和客户端交互

        服务器

#include
#include
#include
#include
#include
#include
#include

#define ERR_MSG(msg) do{\
    fprintf(stderr, "__%d__:", __LINE__);\
    perror(msg);\
}while(0)

#define PORT 8888
#define IP  "192.168.31.111"

int main(int argc, const char *argv[])
{
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }

    struct sockaddr_in sin;
    sin.sin_family      = AF_INET;      
    sin.sin_port        = htons(PORT);  
    sin.sin_addr.s_addr = inet_addr(IP);

    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success\n");

    ssize_t res = 0;
    char buf[128] = "";

    struct sockaddr_in cin;     
    socklen_t addrlen = sizeof(cin);
    

    while(1)
    {
        bzero(buf, sizeof(buf));
        res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, &addrlen);
        if(res < 0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        else if(0 ==strcmp("quit", buf))
        {
            printf("link close ser close.\n");
            break;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buf);

        strcat(buf, "已发送---->");
        if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cin, sizeof(cin)) < 0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("sendto success\n");

    }
    
    close(sfd);

    return 0;
}

        客户端

#include
#include
#include
#include
#include
#include
#include

#define ERR_MSG(msg) do{\
    fprintf(stderr, "__%d__:", __LINE__);\
    perror(msg);\
}while(0)

#define CLI_PORT 6666
#define CLI_IP  "192.168.31.111"

#define SER_PORT 8888
#define SER_IP  "192.168.31.111"

int main(int argc, const char *argv[])
{
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }

    struct sockaddr_in cin;
    cin.sin_family      = AF_INET;      
    cin.sin_port        = htons(CLI_PORT);  
    cin.sin_addr.s_addr = inet_addr(CLI_IP);

    if(bind(sfd, (struct sockaddr*)&cin, sizeof(cin)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success\n");

    struct sockaddr_in sin;
    sin.sin_family      = AF_INET;      
    sin.sin_port        = htons(SER_PORT);  
    sin.sin_addr.s_addr = inet_addr(SER_IP);

    ssize_t res = 0;
    char buf[128] = "";

    struct sockaddr_in rcvaddr;     
    socklen_t addrlen = sizeof(rcvaddr);
    

    while(1)
    {
        bzero(buf, sizeof(buf));
        printf("请输入>>>");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf)-1] = 0;

        if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        if(0 == strcmp("quit", buf))
        {
            printf("客户端退出\n");
            break;
        }
        printf("sendto success\n");

        res = recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&rcvaddr, &addrlen);
        if(res < 0)
        {
            ERR_MSG("recvfrom");
            return -1;
        }
        printf("[%s:%d] : %s\n", inet_ntoa(rcvaddr.sin_addr), ntohs(rcvaddr.sin_port), buf);

    
    }
    close(sfd);

    return 0;
}

 

 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...