[Linux C]TCP通讯例程

2023-05-16

           这个是最最最基本的例程,先开一个坑,稍后再慢慢完善。


服务端程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/ipc.h>
#include<sys/time.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<dirent.h>
#include<signal.h>
#include<sys/socket.h>
#include<netinet/in.h>

#define port 4006

void sigfun(int signal)
{
    while(waitpid(-1,NULL,WNOHANG));
}

int main(void)
{
	int flag = 0;
	int socket_fd,connect_fd;
	
	socket_fd = socket(AF_INET,SOCK_STREAM,0); 	//creat a socket(TCP)	

	if (socket_fd < 0)
        {
	    perror("creat a socket failed!\n");
	    return -1; 
	}

	struct sockaddr_in srv;			//creat an address struct
	bzero(&srv,sizeof(srv));

	srv.sin_family = AF_INET;	        //IPv4
 	srv.sin_port = htons(port);	        //Port ID

	srv.sin_addr.s_addr=htonl(INADDR_ANY);

	/************************
	flag = inet_pton(AF_INET,desIP,&srv.sin_addr);	//IP Address

	if (flag == 0)
	{ 
            perror("invalid IP Address!!!\n");
            return; 
        }
	else if (flag==-1)
	{ 
            perror("af does contain a valid address family!!!\n");
            return; 
        }
	*************************/
	
	bind(socket_fd,(struct sockaddr*)&srv,sizeof(srv));

	listen(socket_fd,3);	//wait and listen

	while (1)
	{
		signal(SIGCHLD,sigfun);

		connect_fd = accept(socket_fd,NULL,NULL);
	
		pid_t pid = fork();	//creat the child process

		if (pid == -1)
			perror("process creat failed!\n");
	
		else if (pid == 0)
		{	
			char* netbuff = (char*) malloc(50*sizeof(char));

			while (1)
			{
			    bzero(netbuff,50);

			    flag = read(connect_fd,netbuff,50);
				
                            if (flag == 0) 
                                break;

			    write(STDOUT_FILENO,netbuff,strlen(netbuff));
			}	
			close(connect_fd);
			free(netbuff);
			exit(0);
		}
	
		else
		    continue;
	}

	return 0;
}


客户端程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>
#include<dirent.h>
#include<signal.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<poll.h>

#define port 4006
#define desIP "192.168.1.253"

int main(void)
{
	int flag = 0;

	int sockfd = socket(AF_INET,SOCK_STREAM,0);    //creat a socket(TCP)	
	
        if (sockfd == -1)
	{ 
            perror("creat a socket failed!\n");
            return; 
        }

	struct sockaddr_in cli;		    //creat a address struct
	bzero(&cli,sizeof(cli));	    //initial

	cli.sin_family = AF_INET;           //IPv4
 	cli.sin_port = htons(port);	    //Port ID

	flag = inet_pton(AF_INET,desIP,&cli.sin_addr);	//set des IP Address
	
        if (flag == 0)
	{ 
             perror("invalid IP Address!!!\n");
             return; 
        }
	else if (flag == -1)
	{ 
             perror("af does contain a valid address family!!!\n");
             return; 
        }
	
	connect(sockfd,(struct sockaddr*)&cli,sizeof(cli));

	char* netbuff = (char*) malloc(50*sizeof(char));

	while (1)
	{
		bzero(netbuff,50);
		
		printf("you say:");
		fgets(netbuff,50,stdin);

		if (strncmp("quit",netbuff,4) == 0) 
                    break;

		write(sockfd,netbuff,strlen(netbuff));
	}	
	
	close(sockfd);
	free(netbuff);
	
	return 0;
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Linux C]TCP通讯例程 的相关文章

  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • 无需超级用户即可在 Linux 中打开 RAW 套接字

    我必须编写一个在 Linux 上运行的 ping 函数 语言是 C 所以 C 也可以 在网上搜索并查看源代码ping命令 事实证明我应该创建一个原始套接字 icmp sock socket AF INET SOCK RAW IPPROTO
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • Linux 为一组进程保留一个处理器(动态)

    有没有办法将处理器排除在正常调度之外 也就是说 使用sched setaffinity我可以指示线程应该在哪个处理器上运行 但我正在寻找相反的情况 也就是说 我想从正常调度中排除给定的处理器 以便只有已明确调度的进程才能在那里运行 我还知道
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐

  • 基于stm32f103zet6的DS1302学习

    由于硬件出了问题 xff0c 也就是外部低速晶振没用 xff0c 震不起来 xff0c 然后查看了网上的帖子 xff0c STM32的RTC果然口碑不怎么样 xff0c 所以果断换DS1302 xff0c 在移植的过程中还算顺利 xff0c
  • 基于stm32f103zet6之使用FSMC驱动TFT的学习

    在完成IO驱动彩屏的试验后 xff0c 就准备着手使用FSMC来驱动彩屏 xff0c 先了解一下预备知识 一 所谓的FSMC机制 简单介绍FSMC在这篇博文里面很清楚 xff0c 推荐一下 http blog csdn net king b
  • (转)ds18b20时序说明

    ds18b20时序说明 新手在DS18B20读写过程中要犯很多错误 老衲普度众生 xff0c 简要说明它怎么用 1 过程1 2是初始化过程 xff0c 每次读取都要初始化 xff0c 否则18b20处于待机状态 xff0c 无法成功读取 过
  • H桥驱动芯片IR2110功能简介

    1 1 驱动芯片IR2110功能简介 在功率变换装置中 xff0c 根据主电路的结构 xff0c 起功率开关器件一般采用直接驱动和隔离驱动两种方式 美国IR公司生产的IR2110驱动器 xff0c 兼有光耦隔离和电磁隔离的优点 xff0c
  • 关于示波器是否必须要接地线的疑问

    这是一个非常隐蔽的问题 xff0c 稍不注意 xff0c 在接入示波器时 xff0c 就会导致线路板上的某些芯片突然爆炸 xff0c 不仅会对项目产生非常大的影响 xff0c 也足以让我们着实郁闷上几天 所以 xff0c 应该足够引起电路设
  • POCO C++库学习和分析 -- 进程

    POCO C 43 43 库学习和分析 进程 Poco Foundation库中涉及进程的内容主要包括了4个主题 xff0c 分别是进程 Process 进程间同步 xff08 inter process synchronization x
  • Mysql安装后在服务里找不到和服务启动不起来的解决方法

    一 安装完MySQL后找不到服务 在那完MySQL数据库后 xff0c 在计算机管理 61 61 服务和应用程序 61 61 服务中找不到MySQL的服务 解决方法 xff1a 1 以管理员的身份运行cmd或者Windows powersh
  • C++中虚继承

    一 虚继承和虚基类 1 多继承产生的冲突 在C 43 43 中多继承时很容易产生命名冲突 xff0c 即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字 xff0c 命名冲突依然有可能发生 xff0c 比如典型的是菱形继承 x
  • 跨平台C++单元测试框架——GTest

    1 简介 GTest是google公司发布的一个跨平台的 Liunx Mac OS X Windows Cygwin Windows CE and Symbian C 43 43 单元测试框架 它提供了丰富的断言 致命和非致命判断 参数化
  • 音频格式之AAC(高级音频编码技术)

    1 简介 ACC xff08 Advanced Audio Coding xff0c 高级音频编码 xff09 是杜比实验室为音乐社区提供的技术 xff0c 出现于1997年 xff0c 基于MPEG 2的音频编码技术 2000年 xff0
  • C++11之lambda回调设置与应用

    在程序中有时候我们需要实现回调效果 xff0c 比如先设置监听 xff0c 然后在后面具体执行完某个操作后再将该操作的结果通知给前面监听中 这种机制实际很常用 xff0c 比如window底下的消息机制 xff0c Qt中的信号槽的机制都有
  • 高速的C/C++编译工具——ccache

    1 简介 ccache xff08 compiler cache 的缩写 xff09 是一个编译器缓存 xff0c 该工具会高速缓存编译生成的信息 xff0c 并在编译的特定部分使用高速缓存的信息 xff0c 比如头文件 xff0c 这样就
  • Django17:内建用户系统

    1 定义 Django带有一个用户认证系统 它处理用户账号 组 权限以及基于cookie的用户会话 用户可以直接是使用Django自带的用户表 2 基本字段 模型类位置from django contrib contrib auth mod
  • Django18:文件上传

    1 上传规范 xff08 1 xff09 前端HTML 文件上传必须为POST提交方式 表达 lt form gt 中文件上传时必须带有enctype 61 multipart formdata 时才会包含文件内容数据 表单中用 lt in
  • Django19:发送邮件

    1 邮件相关协议 xff08 1 xff09 SMTP SMTP xff08 Simple Mail Transfer Protocol xff09 xff0c 简单邮件传输协议 xff08 25号端口 xff09 它是一组用于从原地址到目
  • JsonCpp的基本用法

    1 JsonCpp C 43 43 库 xff0c 允许操作JSON值 xff0c 包括与字符串串行化和序列化 它可在反序列化 序列化步骤中保留现有注释 xff0c 使其成为存储用户输入文件的便捷方式 是一个第三方JSON解析库 xff0c
  • POCO C++库学习和分析 -- 文件系统

    POCO C 43 43 库学习和分析 文件系统 既然作为一个框架性的库 xff0c 自然会提供对于文件系统的操作 在Poco库中 xff0c 封装了一些类去完成上述操作 这些类包括了 xff1a 1 Poco Path 2 Poco Fi
  • C++中的HTTP协议

    1 HTTP Hyper Text Transfer Protocol xff08 超文本传输协议 xff09 是一种通信协议 xff0c 它允许将超文本标记语言 HTML 文档从Web服务器传送到客户端的浏览器 在Internet中所有的
  • C++中析构函数为虚函数

    1 析构函数是否定义为虚函数的区别 xff08 1 xff09 析构函数定义为虚函数时 xff1a 基类指针可以指向派生类的对象 xff08 多态性 xff09 xff0c 如果删除该指针delete p xff1b 就会调用该指针指向的派
  • [Linux C]TCP通讯例程

    这个是最最最基本的例程 xff0c 先开一个坑 xff0c 稍后再慢慢完善 服务端程序 include lt stdio h gt include lt stdlib h gt include lt string h gt include