Linux实验:综合程序设计

Linux实验:综合程序设计,第1张

Linux实验:综合程序设计

文章目录
  • 一、实验目的:
  • 二、实验环境:
  • 三、实验内容:
    • PART 1 程序理解
      • 1.服务器端程序server.c
      • 2.客户端程序client.c
      • 3.程序运行截图
    • PART 2 程序实现
      • 1.服务器端程序server2.c
      • 2.客户端程序client2.c
      • 3.程序运行截图

一、实验目的:

1、了解网络编程概念,了解套接字编程相关技术;
2、掌握socket编程相关函数功能,使用方法;
3、掌握socket编程基本流程及方法。

二、实验环境:

一台运行GNOME图形用户界面的任意一种Linux *** 作系统的计算机。

三、实验内容: PART 1 程序理解 1.服务器端程序server.c

建立一个服务器端程序server.c,代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  
#define SERVER_PORT		6000   //端口号可自己设置
#define SERVER_IP		"192.168.197.130" // IP 地址请自己根据实际情况设置 
int listen_fd = -1;
 
void signal_handler(int arg)
{
	printf("close listen_fd(signal = %d)n", arg);
	close(listen_fd);
	exit(0);
}
 
int main(int argc, const char *argv[])
{
	int new_fd  = -1;
	struct sockaddr_in server;
	struct sockaddr_in client;
	socklen_t saddrlen = sizeof(server);
	socklen_t caddrlen = sizeof(client); 
	signal(SIGINT, signal_handler); 
	memset(&server, 0, sizeof(server));
	memset(&client, 0, sizeof(client));
 
	listen_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (listen_fd < 0)
	{
		printf("socket error!n");
		return -1;
	} 
	server.sin_family = AF_INET;
	server.sin_port = htons(SERVER_PORT);
	server.sin_addr.s_addr = inet_addr(SERVER_IP);
 
	if (bind(listen_fd, (struct sockaddr *)&server, saddrlen) < 0)
	{
		printf("bind error!n");
		return -1;
	}
 
	if (listen(listen_fd, 5) < 0)
	{
		printf("listen error!n");
		return -1;
	}
 
	char rbuf[256] = {0};
	int read_size = 0;
	while (1)
	{		
		new_fd = accept(listen_fd, (struct sockaddr *)&client, &caddrlen);
		if (new_fd < 0)
		{
			perror("accept");
			return -1;
		}
 
		printf("new client connected.IP:%s,port:%un", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
		while (1)
		{
			read_size = read(new_fd, rbuf, sizeof(rbuf));
			if (read_size < 0)
			{
				printf("read error!n");
				continue;
			}
			else if (read_size == 0)
			{
				printf("client (%d) is closed!n", new_fd);
				close(new_fd);
				break;
			} 
			printf("recv:%sn", rbuf);
		}
	} 
	close(listen_fd); 
	return 0;
}

2.客户端程序client.c

建立一个客户端程序client.c,代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
#define SERVER_PORT	6000    // 端口
#define SERVER_IP	"192.168.197.130"	//服务器IP地址
 
int main(int argc, const char *argv[])
{
	int connect_fd = -1;
	struct sockaddr_in server;
	socklen_t saddrlen = sizeof(server); 
	memset(&server, 0, sizeof(server));	
	connect_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (connect_fd < 0)
	{
		printf("socket error!n");
		return -1;
	} 
	server.sin_family = AF_INET;
	server.sin_port = htons(SERVER_PORT);
	server.sin_addr.s_addr = inet_addr(SERVER_IP); 
	if (connect(connect_fd, (struct sockaddr *)&server, saddrlen) < 0)
	{
		printf("connect failed!n");
		return -1;
	} 
	char buf[256] = {0};
	while (1)
	{
		printf(">");
		fgets(buf, sizeof(buf), stdin);
		if (strcmp(buf, "quitn") == 0)
		{
			printf("client will quit!n");
			break;
		}
		write(connect_fd, buf, sizeof(buf));
	}
	close(connect_fd); 
	return 0;
}

3.程序运行截图

编译以上程序,在一个终端窗口中运行server程序,另外打开一个终端窗口,运行client程序。观察程序运行结果。

PART 2 程序实现

PART 1 中实现的功能是客户端向服务器端发送信息,服务器端接收到信息后显示出来,在理解上述程序的基础上,对程序功能进行扩展,实现如下功能:

(1)服务器端接收到信息后,进行简单的加密处理,然后将加密之后的字符串发回给客户端,客户端将其显示出来。 加密策略为:如果字符为英文字符,则进行大小写转换,如果是数字字符,则将相应的数字加6再取个位数,如果是其他字符,则保留原样。如服务器接收到的字符串为:A1b2D9#6,则加密之后的字符串为:a7B8d5#2
(2)如果服务器端接收的字符串是"time",则不需要进行加密,而是将系统时间发送给客户端,客户端显示收到的信息。

1.服务器端程序server2.c

建立一个服务器端程序server2.c,代码如下:

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

#define SERVER_PORT             6000   //端口号可自己设置
#define SERVER_IP               "192.168.197.130" // IP 地址请自己根据实际情况设置
int listen_fd = -1;             //socket描述符

void signal_handler(int arg)    //信号处理,遇到ctrl + c退出
{
    printf("close listen_fd(signal = %d)n", arg);
    close(listen_fd);
    exit(0);
}

//获得系统时间
char* showTime() {
    time_t timer = time(NULL);
    char* showTime = asctime(localtime(&timer));
    return showTime;
}
//特定的加密 *** 作
void endecrypt(char *rbuf){
    char *p = rbuf;
    while (*p != ''){
        if((*p >= 'a' && *p <= 'z')) {
            *p = *p - 32;
        }else if(*p >= 'A' && *p <= 'Z'){
            *p = *p + 32;
        }else if(*p >= '0' && *p <= '9'){
            *p = (((*p - '0') + 6) % 10) + '0';
        }
        p++;
    }
}

int main(int argc, const char *argv[]) {
    int new_fd = -1;               //socket新描述符
    struct sockaddr_in server;
    struct sockaddr_in client;
    socklen_t saddrlen = sizeof(server);
    socklen_t caddrlen = sizeof(client);
    signal(SIGINT, signal_handler);
    memset(&server, 0, sizeof(server));     //初始化
    memset(&client, 0, sizeof(client));
    listen_fd = socket(AF_INET, SOCK_STREAM, 0);    //创建socket,并更新socket描述符
    if (listen_fd < 0)      //如果socket创建失败则退出
    {
        printf("socket error!n");
        return -1;
    }
    server.sin_family = AF_INET;    //设置协议类型为IPv4
    server.sin_port = htons(SERVER_PORT);   //设置端口
    server.sin_addr.s_addr = inet_addr(SERVER_IP);          //将服务器点分十进制ip转换为32位二进制网络字节序并设置

    if (bind(listen_fd, (struct sockaddr *) &server, saddrlen) < 0)  //绑定一个端口号和ip,使套接口与指定的端口号和ip相关联
    {
        printf("bind error!n");
        return -1;
    }

    if (listen(listen_fd, 5) < 0)   //设置监听,最大连接请求数为5
    {
        printf("listen error!n");
        return -1;
    }

    char rbuf[256] = {0};   //缓冲区
    int read_size = 0;
    while (1) {
        new_fd = accept(listen_fd, (struct sockaddr *) &client, &caddrlen);      //接受服务请求,并设置最新socket描述符
        if (new_fd < 0) {
            perror("accept");
            return -1;
        }

        printf("new client connected.IP:%s,port:%un", inet_ntoa(client.sin_addr),ntohs(client.sin_port));     //打印出ip和端口提示
        while (1)       //对接受到的数据进行处理
        {
            read_size = read(new_fd, rbuf, sizeof(rbuf)); //进行读操作,read_size存储数据大小
            if (read_size < 0) {
                printf("read error!n");
                continue;
            } else if (read_size == 0) {
                printf("client (%d) is closed!n", new_fd);
                close(new_fd);
                break;
            }
            printf("----------------收到---------------n");
            printf("%sn", rbuf);
            printf("----------------结束!-----------------n");
            //printf("i want to test:%d len=%dn",strncmp(rbuf, "timen",strlen(rbuf)),strlen(rbuf));
            if (!strncmp(rbuf, "timen",strlen(rbuf) - 1)) {    //这里-1是将换行符去掉
                
                //printf("thisn");
                //char *time = showTime();
                //rbuf = showTime();
                //printf("the time:%sn sizeof_time:%d",time, sizeof(time));
                strcpy(rbuf,showTime());    //将系统时间复制到rbuf
                write(new_fd, rbuf, sizeof(rbuf));  //数据发送
            }else{
//                printf("endecrypt");
                endecrypt(rbuf);
//                printf("encrypt mess:%sn",rbuf);
                write(new_fd,rbuf,sizeof(rbuf));
            }

            printf("---------------我已完成,发送结束---------------n");
        }
    }
    printf("i will cloesn");
    close(listen_fd);
    return 0;
}

2.客户端程序client2.c

建立一个客户端程序client2.c,代码如下:

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

#define SERVER_PORT     6000    // 端口
#define SERVER_IP       "192.168.197.130" //服务器IP地址

int main(int argc, const char *argv[]) {
    int connect_fd = -1;
    struct sockaddr_in server;
    socklen_t saddrlen = sizeof(server);
    memset(&server, 0, sizeof(server));
    connect_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (connect_fd < 0) {
        printf("socket error!n");
        return -1;
    }
    server.sin_family = AF_INET;
    server.sin_port = htons(SERVER_PORT);
    server.sin_addr.s_addr = inet_addr(SERVER_IP);
    if (connect(connect_fd, (struct sockaddr *) &server, saddrlen) < 0) {
        printf("connect failed!n");
        return -1;
    }

    char buf[256] = {0};
    while (1) {
        printf(">");
        fgets(buf, sizeof(buf), stdin);
        if (strcmp(buf, "quitn") == 0) {
            printf("client will quit!n");
            break;
        }
        write(connect_fd, buf, sizeof(buf));

        printf("-----------------有一条信息来自服务器----------------n");
        char sbuf[256] = {0};
        int read_size = read(connect_fd, sbuf, sizeof(sbuf));
        if (read_size < 0) {
            printf("read error!n");
            continue;
        } else if (read_size == 0) {
            printf("mess over!n");
        }
        printf("messg:%sn", sbuf);
        printf("---------------------信息结束---------------------------n");
    }
    close(connect_fd);
    return 0;
}

3.程序运行截图

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5433640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存