2024-2-29-网络编程作业

1>TCP

源代码:

服务器端:

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{
    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);

    bind(sfd, (struct sockaddr *)&sin, sizeof(sin));

    listen(sfd, 128);

    struct sockaddr_in cin;
    socklen_t socklen = sizeof(cin);
    int newfd = accept(sfd, (struct sockaddr *)&cin, &socklen);
    printf("客户端IP:%s, 端口号为:%d\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));
    char rbuf[MAXSIZE] = "";
    while (1)
    {
        bzero(rbuf, sizeof(rbuf));
        int res = recv(newfd, rbuf, sizeof(rbuf),0);
        if (res == 0)
        {
            printf("客户端已经关闭\n");
            break;
        }
        printf("从IP为%s 端口为%d 接收到数据为:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);

        strcat(rbuf, "O.o");
        send(newfd, rbuf, strlen(rbuf),MSG_DONTWAIT);
    }
    close(newfd);
    close(sfd);

    return 0;
}

客户端:

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);

    connect(cfd, (struct sockaddr *)&sin, sizeof(sin));

    char wbuf[MAXSIZE] = "";
    while (1)
    {
        bzero(wbuf, sizeof(wbuf));
        printf("请输入>>>\n");
        fgets(wbuf, sizeof(wbuf), stdin);
        wbuf[strlen(wbuf) - 1] = 0;

        send(cfd, wbuf, strlen(wbuf), 0);
        printf("send success\n");

        if (strcmp(wbuf, "quit") == 0)
        {
            break;
        }

        bzero(wbuf, sizeof(wbuf));
        recv(cfd, wbuf, sizeof(wbuf), 0);
        printf("收到消息为:%s\n", wbuf);
    }

    close(cfd);

    return 0;
}

效果图

2>UDP

源代码:

服务器端

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);
    bind(sfd, (struct sockaddr *)&sin, sizeof(sin));

    char rbuf[MAXSIZE] = "";
    struct sockaddr_in cin;
    socklen_t socklen = sizeof(cin);
    while (1)
    {
        bzero(rbuf, sizeof(rbuf));
        recvfrom(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr *)&cin, &socklen);
        printf("接受到的消息为:%s\n", rbuf);

        strcat(rbuf, "o.O");
        sendto(sfd, rbuf, strlen(rbuf), 0, (struct sockaddr *)&cin,socklen);
        printf("发送成功\n");
    }
    close(sfd);
    return 0;
}

客户端:

#include <myhead.h>
#define SER_IP "10.168.1.111"
#define SER_PORT 8888
#define MAXSIZE 128
int main(int argc, char const *argv[])
{
    int cfd = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(SER_PORT);
    sin.sin_addr.s_addr = inet_addr(SER_IP);

    char wbuf[MAXSIZE] = "";
    while (1)
    {
        bzero(wbuf, sizeof(wbuf));
        printf("请输入>>>:");
        fgets(wbuf,sizeof(wbuf),stdin);
        wbuf[strlen(wbuf)-1] = 0;
        sendto(cfd, wbuf, sizeof(wbuf), 0, (struct sockaddr *)&sin, sizeof(sin));
        printf("发送成功\n");

        bzero(wbuf,sizeof(wbuf));
        recvfrom(cfd, wbuf, sizeof(wbuf), 0, NULL,NULL);
        printf("接受到的消息为:%s\n", wbuf);
    }
    close(cfd);
    return 0;
}

效果图:

3>思维导图

4>面试题整理

1.标准IO的实现

通过操作句柄FILE*类型的指针,使用fopen、fclose、fgets等函数来操作文件。在操作过程中,有一个缓冲区,先将要输入或输出的数据,放入缓冲区后,等到缓冲区刷新时机到了后,统一调用内核提供的函数,将数据刷入内核空间,经由内核空间做后续操作。

2.什么是进程?

进程是程序的一次执行过程,是资源分配的基本单位,每个进程会被分配4Gd的虚拟内存,调度机制为:时间片轮询、上下文切换,有一定的生命周期:创建态-->就绪态-->阻塞态-->运行态-->终止态

3.如何将程序执行直接运行于后台?

a.out 后加 &

4.共享内存通信原理

是多个进程之间的通信,共享内存是将独立于多个进程之外的物理内存,分别映射到不同的进程中,其中一个进程对其进行修改,另一个进程也跟着修改;共享内存中的数据的读写不是一次性的,写入共享内存中的数据,被读取后,依然存在,直到下一次写入的数据将其覆盖;共享内存的操作时,由于共享内存段,相对于多个进程属于临界资源,所以对该资源的使用,需要使用同步机制

5.TCP/IP四层网络通信结构?

网络接口层-->网际层-->运输层-->应用层

6.TCP服务器通信流程

创建套接字-->绑定服务器地址信息结构体-->设置被动监听-->阻塞等待客户端的连接-->数据收发-->关闭套接字

7.路由器位于哪一层?

网际层

8.交换机在哪一层?

网络接口层

9.static的用法

作用:static静态变量

1.static修饰的变量内存在静态区

2.static修饰全局变量:static修饰为初始化的全局变量默认结果为0

3.static修饰局部变量:

延长生命周期(内存的申请到释放),延长至整个文件,类似全局,不是作用域。

static修饰未初始化的局部变量,默认结果为0

4.static修饰函数:static修饰函数,生命周期在本文件有效,不可以跨文件调用

5.static修饰指针:

不可以使用staic修的指针指向auto类型的变量地址。

因为计算机先为static类型变量分配内存,后分配auto类型的变量,不允许使用已存在的变量,指向未知的变量地址。

10.const的用法

修饰的变量不可变。修饰普通变量时,相当于常量,且需要初始化;修饰函数参数时,不管是什么数据类型,也不管是 指针传递,还是 引用传递,只要加了 const 修饰,就可以防止函数内意外修改该参数,起到保护作用;用 const 修饰返回的指针或引用,保护指针或引用的内容不被修改。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值