C语言的网络编程

目录

引言

一、TCP/IP概述

1. TCP(Transmission Control Protocol)

2. UDP(User Datagram Protocol)

二、Socket编程基础

1. 服务器端

2. 客户端

三、URL与HTTP编程

1. 使用libcurl进行HTTP请求

表格总结

TCP/IP与Socket编程

网络编程库

四、网络通信应用

1. 简单聊天程序

五、文件传输应用

表格总结

网络编程常用函数

项目应用举例

总结


引言

网络编程是C语言中一个重要的应用领域,特别在开发基于TCP/IP的网络应用时,网络编程起着至关重要的作用。通过网络编程,程序可以与其他计算机进行数据交换,实现分布式计算和网络服务。本篇文章将详细介绍C语言中的网络编程,包括TCP/IP概述、Socket编程基础、URL与HTTP编程,以及网络通信应用,帮助读者全面理解和掌握C语言中的网络编程技术。

一、TCP/IP概述

TCP/IP是因特网的基础协议,它定义了一组协议来实现网络数据通信。TCP/IP协议分为多个层次,最常用的协议包括TCP和UDP,这些协议在网络编程中至关重要。

1. TCP(Transmission Control Protocol)

TCP是面向连接的协议,提供可靠的数据传输服务。TCP在传输数据之前需要建立连接,并保证数据按顺序到达。

2. UDP(User Datagram Protocol)

UDP是面向无连接的协议,提供不可靠的数据传输服务。UDP不需要建立连接,并不保证数据到达的顺序。

二、Socket编程基础

Socket是网络编程的基础设施,通过它可以实现通信双方的数据交换。Socket编程分为服务器端和客户端。

1. 服务器端

服务器端需要创建Socket、绑定地址和端口、监听连接并接受客户端连接。

示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 8080int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);char buffer[1024] = {0};const char *message = "Hello from server";// 创建socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定socket到地址和端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 监听连接if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}// 接受客户端连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");exit(EXIT_FAILURE);}read(new_socket, buffer, 1024);printf("Message from client: %s\n", buffer);send(new_socket, message, strlen(message), 0);printf("Hello message sent\n");close(new_socket);close(server_fd);return 0;
}

2. 客户端

客户端需要创建Socket、连接服务器,并发送和接收数据。

示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 8080int main() {int sock = 0;struct sockaddr_in serv_addr;char *message = "Hello from client";char buffer[1024] = {0};// 创建socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {printf("\nSocket creation error\n");return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 转换地址if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {printf("\nInvalid address\n");return -1;}// 连接服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {printf("\nConnection failed\n");return -1;}send(sock, message, strlen(message), 0);printf("Hello message sent\n");read(sock, buffer, 1024);printf("Message from server: %s\n", buffer);close(sock);return 0;
}

三、URL与HTTP编程

在网络应用中,URL和HTTP协议是常用的技术。C语言通过libcurl等库实现HTTP编程。

1. 使用libcurl进行HTTP请求

libcurl是一个功能强大的库,支持多种协议,包括HTTP、FTP等。

示例代码:

#include <stdio.h>
#include <curl/curl.h>int main() {CURL *curl;CURLcode res;curl_global_init(CURL_GLOBAL_DEFAULT);curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com/");/* Perform the request, res will get the return code */res = curl_easy_perform(curl);/* Check for errors */if (res != CURLE_OK)fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));/* Always cleanup */curl_easy_cleanup(curl);}curl_global_cleanup();return 0;
}

在上面的示例中,通过libcurl进行HTTP GET请求并获取网页内容。

表格总结

TCP/IP与Socket编程

操作服务器端函数客户端函数
创建Socketsocket(AF_INET, SOCK_STREAM, 0)socket(AF_INET, SOCK_STREAM, 0)
绑定地址和端口bind(server_fd, (struct sockaddr *)&address, sizeof(address))
监听连接listen(server_fd, 3)
接受连接accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))
读取数据read(new_socket, buffer, 1024)read(sock, buffer, 1024)
发送数据send(new_socket, message, strlen(message), 0)send(sock, message, strlen(message), 0)

网络编程库

操作示例
libcurlHTTP GET请求curl_easy_perform(curl)
POSIX sockets创建Socket,连接与传输数据socketconnectsendread

四、网络通信应用

通过网络编程,可以实现各种网络通信应用,如聊天程序、文件传输、网络监控等。

1. 简单聊天程序

下面是一个简单的聊天程序示例,使用TCP进行网络通信。这是一个简化版的聊天系统,由一个服务器端和多个客户端组成。服务器端负责处理多个客户端的连接和消息转发,而客户端负责与服务器进行消息交换。

服务器端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>#define PORT 9090
#define MAX_CLIENTS 100int clients[MAX_CLIENTS];
int client_count = 0;
pthread_mutex_t clients_mutex = PTHREAD_MUTEX_INITIALIZER;void *handle_client(void *client_socket) {int new_socket = *(int *)client_socket;char buffer[1024];int bytes_read;while ((bytes_read = read(new_socket, buffer, sizeof(buffer))) > 0) {buffer[bytes_read] = '\0';printf("Message from client: %s", buffer);// Send message to all clientspthread_mutex_lock(&clients_mutex);for (int i = 0; i < client_count; i++) {if (clients[i] != new_socket) {send(clients[i], buffer, strlen(buffer), 0);}}pthread_mutex_unlock(&clients_mutex);}close(new_socket);return NULL;
}int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);pthread_t tid;server_fd = socket(AF_INET, SOCK_STREAM, 0);address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);bind(server_fd, (struct sockaddr *)&address, sizeof(address));listen(server_fd, 3);printf("Server is listening on port %d\n", PORT);while ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) >= 0) {pthread_mutex_lock(&clients_mutex);clients[client_count++] = new_socket;pthread_mutex_unlock(&clients_mutex);pthread_create(&tid, NULL, handle_client, (void *)&new_socket);}close(server_fd);return 0;
}

客户端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>#define PORT 9090void *receive_messages(void *sock) {int sockfd = *(int *)sock;char buffer[1024];int bytes_read;while ((bytes_read = read(sockfd, buffer, sizeof(buffer))) > 0) {buffer[bytes_read] = '\0';printf("%s", buffer);}return NULL;
}int main() {int sock = 0;struct sockaddr_in serv_addr;char buffer[1024];pthread_t tid;sock = socket(AF_INET, SOCK_STREAM, 0);serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));pthread_create(&tid, NULL, receive_messages, (void *)&sock);while (1) {fgets(buffer, sizeof(buffer), stdin);send(sock, buffer, strlen(buffer), 0);}close(sock);return 0;
}

五、文件传输应用

文件传输是网络编程中的常见任务,下面是一个简单的文件传输示例,展示如何通过网络传输文件。

服务器端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 9090
#define CHUNK_SIZE 1024void send_file(int socket, const char *filename) {FILE *file = fopen(filename, "rb");char buffer[CHUNK_SIZE];int bytes_read;if (file == NULL) {perror("File open error");return;}while ((bytes_read = fread(buffer, 1, CHUNK_SIZE, file)) > 0) {send(socket, buffer, bytes_read, 0);}fclose(file);
}int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);const char *filename = "server_file.txt";server_fd = socket(AF_INET, SOCK_STREAM, 0);address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);bind(server_fd, (struct sockaddr *)&address, sizeof(address));listen(server_fd, 3);new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen);send_file(new_socket, filename);close(new_socket);close(server_fd);return 0;
}

客户端:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define PORT 9090
#define CHUNK_SIZE 1024void receive_file(int socket, const char *filename) {FILE *file = fopen(filename, "wb");char buffer[CHUNK_SIZE];int bytes_read;if (file == NULL) {perror("File open error");return;}while ((bytes_read = read(socket, buffer, CHUNK_SIZE)) > 0) {fwrite(buffer, 1, bytes_read, file);}fclose(file);
}int main() {int sock = 0;struct sockaddr_in serv_addr;const char *filename = "client_file.txt";sock = socket(AF_INET, SOCK_STREAM, 0);serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));receive_file(sock, filename);close(sock);return 0;
}

在上面的示例中,服务器端负责读取文件并通过网络发送给客户端,而客户端负责接收文件并保存到本地。这简单实现了文件传输的基本功能。

表格总结

网络编程常用函数

操作函数示例
创建Socketsocket(AF_INET, SOCK_STREAM, 0)sock = socket(AF_INET, SOCK_STREAM, 0);
绑定地址和端口bind(server_fd, (struct sockaddr *)&address, sizeof(address))bind(server_fd, (struct sockaddr *)&address, sizeof(address));
监听连接listen(server_fd, 3)listen(server_fd, 3);
接受连接accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
连接服务器connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
读取数据read(socket, buffer, sizeof(buffer))read(new_socket, buffer, sizeof(buffer));
发送数据send(socket, buffer, strlen(buffer), 0)send(sock, buffer, strlen(buffer), 0);

项目应用举例

功能服务器端文件处理客户端文件处理说明
简单聊天程序read, sendfgets, read, send双方向消息交流
文件传输程序fopen, fread, sendfopen, fwrite, read服务器发送文件,客户端接收

总结

网络编程在C语言中是一个非常重要的主题,通过Socket编程,程序能够进行网络通信,构建分布式系统和网络应用程序。本文详细介绍了TCP/IP协议、Socket编程基础、URL与HTTP编程,并通过实际示例展示了如何实现网络聊天和文件传输。通过掌握这些知识,编程者可以设计和实现高效、可靠的网络应用,为构建复杂的分布式系统打下坚实基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/354715.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

镭速传输界面优化之静态文件加载

镭速一直是众多企业传输大文件和大数据的优选对象&#xff0c;速度快、稳定且安全是市场上传输软件脱颖而出的立杆标签&#xff0c;那么同样在界面优化和体验的强大也能够给企业用户带来许多直观的感受&#xff0c;那么今天我们就来谈谈镭速是如何做到这些的&#xff0c;在界面…

【锐捷】VSU环境下部署VAC

配置要求 1.两台核心交换机部署VSU&#xff0c;Domain ID为1&#xff0c;S1的Switch ID为1&#xff0c;优先级为150&#xff0c;设备描述为VSU-S1&#xff1b;S2的Switch ID为2&#xff0c;优先级为120&#xff0c;设备描述为VSU-S2&#xff1b;两台设备的G0/48口用于BFD双机检…

go语言对接S3存储的SDK(支持minio和OSS)

背景 在某个项目中&#xff0c;客户要求支持S3协议的存储&#xff0c;因为之前的项目是go来开发的支持的oss和minio 。 但并不一定支持S3的协议&#xff0c;而且使用了二种SDK&#xff0c;感觉比较麻烦。 既然客户提出来了要求。那我们改一下就是了。 操作 引入 go语言中有对…

中国最全的hive sql 函数集合(持续更新)

#6/20/24 增加greatest函数&#xff1a; select greatest(1,2,3,4,5,2) 结论&#xff1a;可以用hive presto spark得出正确的结果值 #6/20/24 增加last_value(cl1) ignore nulls over(order by ts ) as dt 函数&#xff1a; 有数据集&#xff1a; 1 1 1 2 2   3 3 …

振幅调制与解调电路

本章学习内容与重难点 调制的原因 调制就是把低频信号的信息带到高频信号上。 减小天线长度 天线长度与所接收的信号的波长正相关&#xff0c;调制到高频再发送能极大幅度降低接收成本。 避免信号干扰 利用调制将信号抬到不同的通频带&#xff0c;可以有效避免信号频率交叠的相…

Unity制作背包的格子

1.新建一个面板 2.点击面板并添加这个组件 3.点击UI创建一个原始图像&#xff0c;这样我们就会发现图像出现在了面板的左上角。 4.多复制几个并改变 Grid Layout Group的参数就可以实现下面的效果了

汽车信息安全硬件讨论:SE vs HSM

目录 1.什么是Secure Element 2.芯片内置HSM和SE 3.未来HSM的发展 现在的智能网联汽车看起来像是一个连接万物的智能移动终端&#xff0c;它不仅可以与OEM云服务器通信接收OTA推送&#xff0c;还可以与手机蓝牙、Wifi交互完成远程汽车解锁、座舱内环境设置等等&#xff0c;借…

2004年下半年软件设计师【下午题】试题及答案

文章目录 2004年下半年软件设计师下午题--试题2004年下半年软件设计师下午题--答案2004年下半年软件设计师下午题–试题

osgearth提示“simple.earth: file not handled”

在用vcpkg编译完osg和osgearth后&#xff0c;为了验证osgearth编译是否正确&#xff0c;进行测试&#xff0c;模型加载代码如下&#xff1a; root->addChild(osgDB::readNodeFile("simple.earth")); 此时以为是simple.earth路径的问题&#xff0c;遂改为以下代码…

手把手教程 | 云端部署语音合成神器——ChatTTS

近期&#xff0c;ChatTTS 凭借其高度仿真的 AI 语音合成技术迅速走红&#xff01;ChatTTS 是专为对话场景设计的文本转语音模型&#xff0c;例如 LLM 助手对话任务&#xff0c;支持中英文两种语言。其最大的模型在超过 10 万小时的中英文数据上进行训练&#xff0c;确保了高质量…

【机器学习300问】126、词嵌入(Word Embedding)是什么意思?

人类的文字&#xff0c;作为一种高度抽象化的符号系统&#xff0c;承载着丰富而复杂的信息。为了让电脑也能像人类一样理解并处理这些文字&#xff0c;科学家们不断探索各种方法&#xff0c;以期将人类的语言转化为计算机能够理解的格式。 一、One-Hot编码的不足 在自然语言处…

Sklearn中逻辑回归建模

分类模型的评估 回归模型的评估方法&#xff0c;主要有均方误差MSE&#xff0c;R方得分等指标&#xff0c;在分类模型中&#xff0c;我们主要应用的是准确率这个评估指标&#xff0c;除此之外&#xff0c;常用的二分类模型的模型评估指标还有召回率&#xff08;Recall&#xff…

Hedra:让您的照片说话

在数字内容创作的世界里&#xff0c;我们总是在寻找那些能够让我们的作品更加生动和吸引人的工具。Hedra软件就是这样一款工具&#xff0c;它能够让您的照片动起来&#xff0c;甚至说话。想象一下&#xff0c;您的家庭相册中的照片突然变得栩栩如生&#xff0c;或者您的产品图片…

反射机制详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Java从入门到精通 ✨特色专栏&#xff…

SYD881X读取GATT VALUE的长度

SYD881X读取GATT VALUE的长度 现在具体遇到这样一个需要&#xff0c;机器生产后要更新profile&#xff0c;这个只能够通过升级4K来做&#xff0c;但是需要知道profile是否改变了&#xff0c;这个就要知道profile是否改变来决定是否要升级&#xff0c;这里的做法是增加一个函数&…

conda安装pytorch使用清华源

原命令&#xff0c;例&#xff1a; # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch使用清华源&#xff0c;例&#xff1a; # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatool…

地图上绘制地铁线路

需求背景 不管是之前的pms 地铁还是location都会有需求涉及到地图上绘制地铁线路&#xff0c;来查看当前位置是否靠近地铁口&#xff0c;常规的交互可以看下高德地图&#xff0c;如图所示&#xff1a; 需求分析 不管是高德地图还是百度地图都提供了简易版的地铁线路图&#x…

【C++】类和对象(三)构造与析构

文章目录 一、类的6个默认成员函数二、 构造函数干嘛的&#xff1f;语法定义特性综上总结什么是默认构造函数&#xff1f; 三、析构函数干嘛的 &#xff1f;语法定义析构顺序 一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中并不是真的什么…

it职业生涯规划系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;职业介绍管理&#xff0c;答题管理&#xff0c;试题管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;在线答题&#xff0…

RealityCheck™电机监测和预测性维护模型

RealityCheck™电机 一个附加的软件工具箱&#xff0c;可实现条件监测和预测性维护功能&#xff0c;而无需依赖额外的传感器。相反&#xff0c;它使用来自电机控制过程的电子信息作为振动和其他传感器的代理。凭借其先进的信号处理和机器学习(ML)模型&#xff0c;RealityCheck …