之前尝试过windows下的简单TCP客户端服务器编写,这次尝试下一下Linux环境下的TCP

客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> struct CustomMessage {
char university[4]; // "AHU\0"
char major[32]; // 专业
char data[256]; // 消息数据
}; int main() {
int client_socket;
struct sockaddr_in server_address; // 创建套接字
client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
} // 设置服务器地址
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8888);
if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0) {
perror("Invalid IP address");
close(client_socket);
exit(EXIT_FAILURE);
} // 连接服务器
if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
perror("Connection failed");
close(client_socket);
exit(EXIT_FAILURE);
} while (1) {
// 获取用户输入的消息
printf("请输入要发送的消息 (输入 exit 结束): ");
struct CustomMessage message_to_send;
fgets(message_to_send.data, sizeof(message_to_send.data), stdin);
message_to_send.data[strcspn(message_to_send.data, "\n")] = '\0'; // 移除换行符
strcpy(message_to_send.university, "AHU"); // 设置学校为"AHU"
strcpy(message_to_send.major, "CS"); // 设置专业为"CS" // 发送自定义消息
int bytes_sent = send(client_socket, (const char*)&message_to_send, sizeof(struct CustomMessage), 0);
if (bytes_sent < 0) {
perror("Send failed");
close(client_socket);
exit(EXIT_FAILURE);
} // 如果用户输入 "exit",结束循环
if (strcmp(message_to_send.data, "exit") == 0) {
break;
}
} // 关闭客户端套接字
close(client_socket); return 0;
}

服务器端代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define PORT 8888
#define MAX_PENDING_CONNECTIONS 5 struct CustomMessage {
char university[4];
char major[32];
char data[256];
}; int main() {
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
socklen_t client_address_length = sizeof(client_address); server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
} memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(PORT); if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
perror("Bind failed");
close(server_socket);
exit(EXIT_FAILURE);
} if (listen(server_socket, MAX_PENDING_CONNECTIONS) < 0) {
perror("Listen failed");
close(server_socket);
exit(EXIT_FAILURE);
} printf("Server listening on port %d...\n", PORT); while (1) {
client_socket = accept(server_socket, (struct sockaddr*)&client_address, &client_address_length);
if (client_socket < 0) {
perror("Accept failed");
close(server_socket);
exit(EXIT_FAILURE);
} while (1) {
struct CustomMessage received_message;
ssize_t bytes_received = recv(client_socket, (char*)&received_message, sizeof(struct CustomMessage), 0);
if (bytes_received > 0) {
printf("Received Message:\n");
printf("University: %s\n", received_message.university);
printf("Major: %s\n", received_message.major);
printf("Data: %s\n", received_message.data); if (strcmp(received_message.data, "exit") == 0) {
close(client_socket);
break;
}
}
else if (bytes_received == 0) {
printf("Client disconnected\n");
close(client_socket);
break;
}
else {
perror("Receive failed");
close(client_socket);
break;
}
}
} close(server_socket); return 0;
}

运行结果

Linux下TCP/IP编程--TCP实战的更多相关文章

  1. .Neter玩转Linux系列之四:Linux下shell介绍以及TCP、IP基础

    基础篇 .Neter玩转Linux系列之一:初识Linux .Neter玩转Linux系列之二:Linux下的文件目录及文件目录的权限 .Neter玩转Linux系列之三:Linux下的分区讲解 .N ...

  2. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解

    最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...

  3. Linux下的C编程实战

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...

  4. TCP/IP、TCP、UDP、Socket知识汇总

    带你了解TCP/IP,UDP,Socket之间关系 https://blog.csdn.net/chaoshenzhaoxichao/article/details/79785318 主要知识点: T ...

  5. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  6. linux下的c编程

    linux下的c编程 Linux 系统上可用的 C 编译器是 GNU C 编译器, 它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布.GNU  C 对标准 C 进行一系列扩展,以增强标准 ...

  7. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  8. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  9. Ubuntu Linux下设置IP的配置命令

    Ubuntu Linux下设置IP的配置命令 今天装了Ubuntu,但是发现不能上网,开始排查问题: 1.首先确定网络连接是否正确,所用的网线是否可以正常工作 2.查看网卡是否能正常工作,检测的方法如 ...

  10. LINUX下C语言编程调用函数、链接头文件以及库文件

    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

随机推荐

  1. USB协议详解第11讲(USB描述符-总结)

    描述符回顾总结 1.其实所有的描述符都是USB设备用来描述自己属性及用途的,所以必须在设备端实现对应的描述符,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备.设备需要的总 ...

  2. Uefi ABL读取XBL设置的标志位

    PBL(启动固化程序)-> XBL(扩展引导加载程序,负责初始化芯片驱动和核心应用功能.XBL通常会加载一些平台相关的驱动程序,并提供通用接口)-> ABL(应用引导加载程序,负责引导操作 ...

  3. 深入理解虚拟 物理地址转换,页表--基于ARMV8

    1. 页表转换寄存器描述符 1.1,页表/页目录结构 基于前言中的内核配置,内核采用39位虚拟地址,因此可寻址范围为2^39 = 512G,采用(linux 默认为五级页表,另外还有PUD,P4D,由 ...

  4. GPT分区和MRB分区

    GPT分区和MBR分区都是硬盘分区的方式,但它们有不同的实现方法和优缺点. MBR(Master Boot Record)分区是传统的分区方式,它将硬盘分为四个主分区或者三个主分区和一个扩展分区.在每 ...

  5. 使用GrabCut做分割

    主要完成了界面化设计,代码如下 import cv2 as cv import numpy as np import sys from PyQt5.Qt import * class MyWedige ...

  6. axios 常见状态码

    '100': 'Continue', '101': 'SwitchingProtocols', '102': 'Processing', '103': 'EarlyHints', '200': 'Ok ...

  7. HN CSP-J 2023 奇人鉴赏

    其中有 4 位同学提到了IOI 一位同学提到了 fk,但是并没有 Fk CCF 共有52个 CCF,其中HN-J00157同学复制了很多遍题目一位同学用了ccf当 struct 名字,并且写出了人名函 ...

  8. linux 基础(9)背景工作管理

    前景和背景工作管理 在 linux 中,进程以调用顺序构成一棵树,系统的初始程序是 systemd,然后一个程序又调用另一个程序.当你在 bash 里输入其他指令,这些指令就作为当前shell 的子进 ...

  9. 实现.NET 4.0下的Task类相似功能组件

    实现 .NET 4.0 下的 Task 类相似功能:TaskExCum 组件详解 引言 随着 .NET 技术的发展,异步编程模型逐渐成为现代应用程序开发中的标准实践之一..NET 4.5 引入了 Ta ...

  10. C221027B

    B 抽 \(n\) 次卡, 连续 \(i\) 次没有抽中时, 第 \(i+1\) 次抽中的概率是 \(p_i\), 规定\(p_k=1\), 求期望抽中次数. 标签:矩阵加速递推, 动态规划. 暴力: ...