Linux程序开发(十三):网络编程实现0521深情告白

发布于:2024-05-22 ⋅ 阅读:(53) ⋅ 点赞:(0)

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!

喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!数据源存放在我的资源下载区啦!

Linux程序开发(十三):网络编程实现0521深情告白


题目:网络传情

题目描述:
小明和小红是一对异地恋的情侣,他们每天都会通过网络互相传递爱意。为了增强这种互动的乐趣,他们希望编写一个小程序来模拟发送和接收消息的过程。

要求:
请你编写一个基于 Linux 网络编程的 C 语言程序,实现以下功能:
1、小明作为服务器端,监听某个指定端口,等待小红的消息;
2、小红作为客户端,连接到小明的服务器端,并发送消息给小明;
3、小明接收到小红的消息后,打印出消息内容,并回复一个自定义的消息给小红;
4、小红接收到小明的回复后,打印出回复的消息内容。

注意事项:

程序需要处理异常情况,如网络连接失败等;
可以使用 TCP 或 UDP 协议实现。

示例:
小明的 IP 地址为 192.168.52.100,端口号为 8888;
小红的 IP 地址为 192.168.52.200,端口号为 9999。

小红发送消息:Hello, 小明!我想你了~
小明收到消息并回复:Hello, 小红!我也想你了~
小红收到回复:Hello, 小明!我也想你了~
解答:

# server.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 8888
int main() {
    int sockfd, newsockfd;
    socklen_t clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int n;
    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Error opening socket");
        exit(1);
    }
    // 设置服务器地址
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(PORT);
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    // 绑定套接字到指定端口
    if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("Error binding");
        exit(1);
    }
    // 监听连接
    listen(sockfd, 5);
    printf("等待小红的消息...\n");
    // 接收连接请求
    clilen = sizeof(cli_addr);
    newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
    if (newsockfd < 0) {
        perror("Error accepting connection");
        exit(1);
    }
    // 接收消息
    memset(buffer, 0, sizeof(buffer));
    n = read(newsockfd, buffer, sizeof(buffer));
    if (n < 0) {
        perror("Error reading from socket");
        exit(1);
    }
    printf("小红发送消息:%s\n", buffer);
    // 回复消息
    char reply[] = "Hello, 小红!我也想你了~";
    n = write(newsockfd, reply, strlen(reply));
    if (n < 0) {
        perror("Error writing to socket");
        exit(1);
    }
    // 关闭连接
    close(newsockfd);
    close(sockfd);
    return 0;
}
# client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define PORT 8888
#define SERVER_IP "192.168.52.3"
int main() {
    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    char buffer[256];
    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("Error opening socket");
        exit(1);}
    // 获取服务器地址信息
    server = gethostbyname(SERVER_IP);
    if (server == NULL) {
        fprintf(stderr, "Error, no such host\n");
        exit(1);}
    // 设置服务器地址
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length);
    serv_addr.sin_port = htons(PORT);
    // 连接服务器
    if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
        perror("Error connecting");
        exit(1);}
    // 发送消息
    char message[] = "Hello, 小明!我想你了~";
    if (write(sockfd, message, strlen(message)) < 0) {
        perror("Error writing to socket");
        exit(1);}
    printf("发送消息:%s\n", message);
    // 接收回复
    memset(buffer, 0, sizeof(buffer));
    if (read(sockfd, buffer, sizeof(buffer)) < 0) {
        perror("Error reading from socket");
        exit(1);}
    printf("小明回复:%s\n", buffer);
    // 关闭连接
    close(sockfd);
    return 0;}

截图:

在这里插入图片描述

图 4.1 服务端结果图
在这里插入图片描述
图 4.2 客户端结果图