首页 > 其他分享 >socket测试(多线程,课上测试)

socket测试(多线程,课上测试)

时间:2023-11-27 15:36:35浏览次数:32  
标签:include addr int server 课上 client fd 测试 多线程

  1. 基于socket 实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端
    服务器响应消息格式是

    客户端IP:XXXX
    客户端PID:XXXX
    服务器tid:XXXX
    服务器实现者学号:XXXXXXXX
    当前时间: XX:XX:XX

    注意服务器端要通过多线程实现,每次客户端链接到服务器,服务器就启动一个新线程和客户端连接。
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <pthread.h>

#define BUFFER_SIZE 1024

void *handle_client(void *arg);
void send_daytime(int client_fd);

int main(int argc, char *argv[]) {
    int server_fd, client_fd, port;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(struct sockaddr_in);
    pthread_t tid;

    if (argc != 2) {
        printf("Usage: %s [port]\n", argv[0]);
        return 1;
    }

    port = atoi(argv[1]);

    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("socket");
        return 1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(server_fd, (struct sockaddr *)&server_addr, addr_len) < 0) {
        perror("bind");
        return 1;
    }

    if (listen(server_fd, 5) < 0) {
        perror("listen");
        return 1;
    }

    while (1) {
        client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
        if (client_fd < 0) {
            perror("accept");
            continue;
        }

        pthread_create(&tid, NULL, handle_client, (void *)&client_fd);
        pthread_detach(tid);
    }

    close(server_fd);
    return 0;
}

void *handle_client(void *arg) {
    int client_fd = *((int *)arg);
    char buffer[BUFFER_SIZE];

    send_daytime(client_fd);

    while (1) {
        memset(buffer, 0, BUFFER_SIZE);
        if (recv(client_fd, buffer, BUFFER_SIZE, 0) <= 0) {
            break;
        }
        printf("Received: %s\n", buffer);
    }

    close(client_fd);
    return NULL;
}

void send_daytime(int client_fd) {
    char buffer[BUFFER_SIZE];
    time_t rawtime;
    struct tm *timeinfo;

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    snprintf(buffer, BUFFER_SIZE, "客户端IP:%lu\n客户端PID:%lu\n服务器tid:%lu\n服务器实现者学号:20211116\n当前时间:%02d:%02d:%02d\n",
              inet_addr("127.0.0.1"),
              getpid(),
              pthread_self(),
              buffer);

    send(client_fd, buffer, strlen(buffer), 0);
}
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define BUFFER_SIZE 1024

void send_message(int server_fd, const char *message);

int main(int argc, char *argv[]) {
    int client_fd;
    struct sockaddr_in server_addr;
    char buffer[BUFFER_SIZE];

    if (argc != 2) {
        printf("Usage: %s [IP_address]\n", argv[0]);
        return 1;
    }

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(13116); // DAYTIME port
    inet_aton(argv[1], &server_addr.sin_addr);

    client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd < 0) {
        perror("socket");
        return 1;
    }

    if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("connect");
        close(client_fd);
        return 1;
    }

    send_message(client_fd, "GET DAYTIME\n");

    while (1) {
        memset(buffer, 0, BUFFER_SIZE);
        if (recv(client_fd, buffer, BUFFER_SIZE, 0) <= 0) {
            break;
        }
        printf("Received: %s\n", buffer);
    }

    close(client_fd);
    return 0;
}

void send_message(int server_fd, const char *message) {
    send(server_fd, message, strlen(message), 0);
}

  1. 提交一个客户端至少查询三次时间的截图测试截图

  2. 提交至少两个客户端查询时间的截图测试截图

image

标签:include,addr,int,server,课上,client,fd,测试,多线程
From: https://www.cnblogs.com/Vicky-Peng/p/17859451.html

相关文章

  • 多进程测试(课上测试)
    编写程序rxx(xx为你学号后两位),rxx-o生成并打印一个奇数随机数,rxx-e生成并打印一个偶数随机数。提交代码和运行结果截图。点击查看代码#include<stdio.h>#include<stdlib.h>intmain(intargc,char*argv[]){intnum;intflag;if(argc!=3)......
  • 多线程复制文件夹
    pThread复制文件夹C++通过pthread复制文件夹。主要处理普通文件和链接文件。事实上只要处理好链接文件即可。我们可以通过判断链接的文件是文件夹还是文件即可判断对当前文件是通过文件直接复制还是通过文件夹递归复制。#include<iostream>#include<dirent.h>#include<stri......
  • cat userlist(课上测试)
    Linux文件系统的三层抽象是什么?分别为用户层、虚拟文件系统层和设备驱动层。写出Catuserlist的过程,要详述目录文件,i-node.数据块,要画图示意假设文件大小为10KB,块大小为4KB。目录文件(DirectoryFile):假设userlist文件位于/home/user目录下。该目录有一个对应的目录文件,......
  • stat命令的实现-mysate(课上测试)
    提交学习stat(1)的截图推导出实现stat(1)需要的系统调用,并给出实现stat(1)的伪代码需要的系统调用:readdir()、closedir()、fstat()、lstat()、fstatat()伪代码#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/stat.h>#include<dirent.h>......
  • std::future与std::promise在C++多线程同步与数据共享中的应用
    1、std::promise与std::futurestd::promise与std::future通过配合使用完成数据的同步与共享,两者均是模板类;std::promise存储异步执行的值或异常;std::future提供可供访问的异步执行结果。二者配合使用伪码如下:std::promise<Type>pr;std::future<Type>fu(pr.get_fu......
  • 网络渗透测试:wireshark抓取qq图片
    打开wireshark,打开qq因为连的是WiFi,所以这里选择WLAN  用手机给电脑发送jpg文件,随后开始抓取,我们给电脑发送的是jpg文件,所以筛选十六进制值为ffd8ff  鼠标右键,选择追踪流,tcp,选择原始数据 将其保存,然后放到winhex里,查找ffd8,将前面的数据删去,然后保存为jpg文件。......
  • 多线程
    1.进程和线程进程是一个应用程序线程是一个进程中执行场景,执行单元一个进程可以启动多个线程,进程与进程之间内存独立不共享2.在Java语言中:任意两个线程与线程之间,堆内存和方法区内存共享,因为对内存和方法区只有一个,但是栈内存独立,一个线程一个栈,栈内存有很多个假设有十个线程,会有......
  • 多线程2.0
    说起进程就不得不说程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念而进程则是执行程序的一次执行过程,他是一个动态的概念,是系统资源分配的单位通常在一个进程中可以包含若干个线程,当然一个进程至少有一个线程,不然没有存在的意义,线程是cpu调度和执行的......
  • 多线程.模拟龟兔赛跑
    packageJavaSE.Thread.document01;/***模拟龟兔赛跑*/publicclassDemo05implementsRunnable{publicstaticStringwinner;//胜者@Overridepublicvoidrun(){for(inti=1;i<=100;i++){if(Thread.currentThread().getName()......
  • 建议学习软件测试吗?不建议!
    相比较大多数行业,IT行业薪资比较高。如果你问我,是否建议学习软件测试。我的回答是,不建议!学历太高不建议学习,你可以挑战天花板更高的软件开发行业;学历太低不建议学习,没有全日制专科以上学历基本找不到工作;年龄太大不建议学习,软件测试可能同样存在年龄歧视;不想编程不建议学习,......