您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C语言进行Linux网络编程

时间:2022-03-17 13:03:12  来源:  作者:AioT智能家居

之前介绍了网络字节序。网络编程之网络字节序详解

今天就来实现一下简单的网络程序。

先看几个函数

// 创建socket套接字
int socket(int domAIn, int type, int protocol);
// 绑定服务器地址
int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);
// 接收连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 连接服务器
int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

服务器端程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/.NET.h>
#include <sys/socket.h>

typedef struct _MSG {
	int id;
	short length;
	short reserve;
	char content[100];
} MSG;

int main(int argc, char *argv[])
{
	int serv_sock;
	int clnt_sock;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[] = "Hello world!";

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

	serv_sock = socket(AF_INET, SOCK_STREAM, 0);
	if (serv_sock == -1) {
		printf("socket errorn");
		return -1;
	}

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	// 转换为网络字节序,INADDR_ANY表示绑定本机所有ip地址
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	// 将端口转换为网络字节序
	serv_addr.sin_port = htons(atoi(argv[1]));

	if (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
		printf("bind errorn");
		return -1;
	}

	if (listen(serv_sock, 5) == -1) {
		printf("listen errorn");
		return -1;
	}

	clnt_addr_size = sizeof(clnt_addr);
	clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_size);
	if (clnt_sock == -1) {
		printf("accept errorn");
	}

	for (int i = 0; i < 10; i++) {
		MSG msg;
		msg.id = htonl(i);
		msg.length = htons(strlen("hello world"));
		msg.reserve = htons(0);
		strcpy(msg.content, "hello world");

		write(clnt_sock, (char *)&msg, sizeof(MSG));
	}

	close(clnt_sock);
	close(serv_sock);

	return 0;
}

客户端程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

typedef struct _MSG {
	int id;
	short length;
	short reserve;
	char content[100];
} MSG;

int main(int argc, char *argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	int str_len;

	if (argc != 3)
	{
		printf("Usage: %s <IP> <port>n", argv[0]);
		return -1;
	}

	sock = socket(AF_INET, SOCK_STREAM, 0);
	if (sock == -1) {
		printf("socket errorn");
		return -1;
	}

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
	serv_addr.sin_port = htons(atoi(argv[2]));

	if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
		printf("connect errorn");
		return -1;
	}

	for (;;) {
		MSG msg;
		str_len = read(sock, &msg, sizeof(msg));
		if (str_len <= 0) {
			printf("read errorn");
			break;
		}
		msg.id = ntohl(msg.id);
		msg.length = ntohs(msg.length);
		printf ("msg(id, length, content): %3d, %3d, %sn", msg.id, msg.length, msg.content);
	}


	close(sock);

	return 0;
}

运行效果如下

 

C语言进行Linux网络编程

 

 

 

C语言进行Linux网络编程


Tags:网络编程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
从零开始学习Python网络编程:探索TCP协议与实例演示!
Python 是一种高级的编程语言,拥有广泛的网络编程库。这些库允许 Python 开发者能够使用 TCP 和其他网络协议进行通信。在本文中,我们将探讨 TCP 协议,并通过一个简单的例子来...【详细内容】
2023-11-23  Search: 网络编程  点击:(219)  评论:(0)  加入收藏
从零开始学Python网络编程:轻松搭建服务器和客户端
Python网络编程的基础知识是成为一名全面的Python开发者的关键一步。网络编程使我们能够创建各种类型的网络应用程序,从简单的客户端/服务器应用到复杂的Web应用和网络爬虫。...【详细内容】
2023-11-17  Search: 网络编程  点击:(209)  评论:(0)  加入收藏
Linux高性能网络编程
上一篇文章讲了高性能编程的工具,这一篇我们基于前面的一些知识点和工具来聊一下Linux下的性能优化(本知识点分为两篇,当前主要介绍CPU和内存性能优化)。第一部分:CPU和内存性...【详细内容】
2023-11-01  Search: 网络编程  点击:(173)  评论:(0)  加入收藏
Tars-Java网络编程源码分析
作者:vivo 互联网服务器团队- Jin Kai本文从Java NIO网络编程的基础知识讲到了Tars框架使用NIO进行网络编程的源码分析。一、Tars框架基本介绍Tars是腾讯开源的支持多语言的...【详细内容】
2023-06-29  Search: 网络编程  点击:(209)  评论:(0)  加入收藏
Java中如何使用多线程进行网络编程?
在Java中,使用多线程进行网络编程可以帮助我们实现并发处理和提高程序的效率。下面是一个简单的示例代码:import java.io.IOException;import java.net.ServerSocket;import j...【详细内容】
2023-05-15  Search: 网络编程  点击:(279)  评论:(0)  加入收藏
介绍几种 .NET 中常用的网络编程类型及其示例
介绍几种 .NET 中常用的网络编程类型及其示例:1. Socket 编程Socket 是最基础、最原始的网络编程方式之一,它提供了一组 API 来实现数据传输和通信。使用 Socket 编程时需要...【详细内容】
2023-05-09  Search: 网络编程  点击:(491)  评论:(0)  加入收藏
Python,文件操作和读写操作,网络编程,TCP通信基础知识
Python文件操作和读写操作Python文件读写模式r,只读方式打开,必须确保文件存在,否则报错。w,写入方式打开,如果文件存在会清空,不存在会创建。a,追加方式打开,如果不存在会创建,追加...【详细内容】
2022-08-27  Search: 网络编程  点击:(457)  评论:(0)  加入收藏
网络编程之网络丢包故障如何定位?如何解决?
引言本期分享一个比较常见的网络问题--丢包。例如我们去ping一个网站,如果能ping通,且网站返回信息全面,则说明与网站服务器的通信是畅通的,如果ping不通,或者网站返回的信息不全...【详细内容】
2022-04-21  Search: 网络编程  点击:(1375)  评论:(0)  加入收藏
C语言进行Linux网络编程
之前介绍了网络字节序。网络编程之网络字节序详解今天就来实现一下简单的网络程序。先看几个函数// 创建socket套接字int socket(int domain, int type, int protocol);//...【详细内容】
2022-03-17  Search: 网络编程  点击:(483)  评论:(0)  加入收藏
全网最全的Java岗网络编程+异常处理面试题(含答案)
IP地址和端口号1)IP地址用来标志网络中的一个通信实体的地址。通信实体可以是计算机,路由器等。2)IP地址分类IPV4:32位地址,以点分十进制表示,如192.168.0.1IPV6:128位(16个字节)写成...【详细内容】
2022-03-17  Search: 网络编程  点击:(285)  评论:(0)  加入收藏
▌简易百科推荐
C++中的外部模板及其在当前编译文件中的实例化
在C++中,模板是一种泛型编程的工具,它允许程序员以一种类型无关的方式编写代码。然而,模板的一个常见问题是它们会导致编译时间增加,特别是在大型项目中,当多个源文件包含相同的...【详细内容】
2024-04-11  鲨鱼编程  微信公众号  Tags:C++   点击:(8)  评论:(0)  加入收藏
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  腾讯技术工程    Tags:C++   点击:(8)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25    CSDN  Tags:C++   点击:(7)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  AI让生活更美好  微信公众号  Tags:C++   点击:(27)  评论:(0)  加入收藏
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  程序员编程日记  微信公众号  Tags:C#   点击:(33)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  架构师老卢  今日头条  Tags:C#   点击:(32)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03     AI让生活更美好  Tags:C++   点击:(73)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  AI让生活更美好  微信公众号  Tags:C++   点击:(121)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  一线码农聊技术  微信公众号  Tags:C#   点击:(74)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  鲨鱼编程  微信公众号  Tags:C++   点击:(122)  评论:(0)  加入收藏
站内最新
站内热门
站内头条