网络编程之三

2023-11-09

【代码1】chat_tcp_client1.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	int connfd = -1;
	
	if (0 > (connfd = socket(AF_INET, SOCK_STREAM, 0)))
		err_exit("socket");
	
	struct sockaddr_in server;
	
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(8888);
	server.sin_addr.s_addr = inet_addr("192.168.80.128");
	
	
	if ( 0 > connect(connfd, (struct sockaddr *)&server, sizeof(server)))
		err_exit("connect");
	
	printf("connect success!\n");
	char w_buf[BUFSIZ];
	char r_buf[BUFSIZ];
	int ret;
	fd_set readfds;
	int maxfd = -1;
	int i;
	
	while(1) {
		FD_ZERO(&readfds);
		FD_SET(0, &readfds);
		maxfd = 0 > maxfd ? 0 : maxfd;

		FD_SET(connfd, &readfds);
		maxfd = connfd > maxfd ? connfd : maxfd;
		ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
		if (0 > ret)
			err_exit("select");
		else {
			for (i = 0; i <= maxfd; i++) {
				if (FD_ISSET(i, &readfds)) {
					if (0 == i) {
						fgets(w_buf, sizeof(w_buf), stdin);
						if (!strncmp(w_buf, "quit", 4)) {
							fprintf(stderr, "client quit!\n");
							exit(0);
						}
						send(connfd, w_buf, strlen(w_buf) + 1, 0);					
					} else if (connfd == i) {
						ret = recv(connfd, r_buf, sizeof(r_buf), 0);
						if (ret < 0)
							err_exit("recv");
						else if (ret == 0) {
							printf("server quit!\n");
							exit(0);
						}
						printf("server : %s", r_buf);						
					}
				}
			}
		}	
	}
	close(connfd);
	
	exit(0);
}

 

【代码2】chat_tcp_serve1r.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	int listenfd = -1;
	
	if (0 > (listenfd = socket(AF_INET, SOCK_STREAM, 0)))
		err_exit("socket");
	
	struct sockaddr_in server, client;
	
	bzero(&server, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(8888);
	/* server.sin_addr.s_addr = inet_addr("192.168.80.128"); */
	/* inet_aton("192.168.80.128", &server.sin_addr); */
	server.sin_addr.s_addr = htonl(INADDR_ANY);
	/* server.sin_addr.s_addr = inet_addr("0"); */
	
	int on = 1;
	
	if (0 > setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
		err_exit("setsockopt");
	
	if (0 > bind(listenfd, (struct sockaddr *)&server, sizeof(server)))
		err_exit("bind");

	listen(listenfd, 1024);
	printf("listen...\n");
	bzero(&client, sizeof(client));
	socklen_t len = sizeof(client);  // must be done!
	int connfd = -1;
	
	if ( 0 > (connfd = accept(listenfd, (struct sockaddr *)&client, &len)))
		err_exit("accept");

	printf("client ip is %s, port number is %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
	char w_buf[BUFSIZ];
	char r_buf[BUFSIZ];
	int ret;
	fd_set readfds;
	int maxfd = -1;
	int i;
	
	while(1) {
		FD_ZERO(&readfds);
		FD_SET(0, &readfds);
		maxfd = 0 > maxfd ? 0 : maxfd;  // 0 -- stdin
		FD_SET(connfd, &readfds);
		maxfd = connfd > maxfd ? connfd : maxfd; // connfd -- socket for communication
		ret = select(maxfd + 1, &readfds, NULL, NULL, NULL);
		if (0 > ret)
			err_exit("select");
		else {
			for (i = 0; i <= maxfd; i++) {
				if (FD_ISSET(i, &readfds)) {
					if (0 == i) {
						fgets(w_buf, sizeof(w_buf), stdin);
						if (!strncmp(w_buf, "quit", 4)) {
							printf("server quit!\n");
							exit(0);
						}
						if (0 > send(connfd, w_buf, strlen(w_buf) + 1, 0))
							err_exit("send");					
					} else if (connfd == i) {
						ret = recv(connfd, r_buf, sizeof(r_buf), 0);
						if (ret < 0)
							err_exit("recv");
						else if (ret == 0) {
							printf("client quit!\n");
							exit(0);
						}
						printf("client : %s", r_buf);					
					}
				}
			}
		}
	}	
	
	close(listenfd);
	close(connfd);
	
	exit(0);
}

 

【代码3】test_select.c

 

#include "header.h"
#include <fcntl.h>

int main(int argc, char *argv[])
{
	fd_set readfds;
	struct timeval tm;
	int ret;
	
	memset(&tm, 0, sizeof(tm));

	char buf[32];
	
	while(1) {
		FD_ZERO(&readfds);
		FD_SET(0, &readfds);
		tm.tv_sec = 2;
		tm.tv_usec = 0;		
		ret = select(1, &readfds, NULL, NULL, &tm);
		if (0 > ret)
			err_exit("select");
		else if (0 == ret) {
			printf("timeout!\n");
		} else {
			fgets(buf, sizeof(buf), stdin);
			printf("fgets : %s", buf);
			fflush(stdout);
		}		
	}

	exit(0);
}

 

【代码4】test_udp_client.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	if (3 > argc) {
		fprintf(stderr, "Usage : %s + server IP + portnumber\n", argv[0]);
		exit(1);
	}

	unsigned short port;
	/* printf("%d\n",atoi(argv[1])); */
	
	if (0 >= (port = atoi(argv[2]))) {
		fprintf(stderr, "port number is invalid!\n");
		exit(1);
	}
	
	int connfd = -1;
	if (0 > (connfd = socket(AF_INET, SOCK_DGRAM, 0)))
		err_exit("socket");

	struct sockaddr_in server;
	memset(&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(port);
	inet_aton(argv[1], &server.sin_addr);

	
	char buf[BUFSIZ];
	/* struct sockaddr_in client; */
	/* memset(&client, 0, sizeof(client)); */
	/* socklen_t len = sizeof(client);  /\* must be done! *\/ */
	
	while(1) {
		fgets(buf, sizeof(buf), stdin);
		sendto(connfd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&server, sizeof(server));	
		recvfrom(connfd, buf, sizeof(buf), 0, NULL, NULL);
		//printf("client(ip : %s, port : %d) : %s", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buf);
		printf("%s", buf);
	}
	close(connfd);
	exit(0);
}

 

【代码5】test_udp_server.c

 

#include "header.h"

int main(int argc, char *argv[])
{
	if (2 > argc) {
		fprintf(stderr, "Usage : %s + portnumber\n", argv[0]);
		exit(1);
	}

	unsigned short port;
	/* printf("%d\n",atoi(argv[1])); */
	
	if (0 >= (port = atoi(argv[1]))) {
		fprintf(stderr, "port number is invalid!\n");
		exit(1);
	}
	
	int connfd = -1;
	if (0 > (connfd = socket(AF_INET, SOCK_DGRAM, 0)))
		err_exit("socket");

	struct sockaddr_in server;
	memset(&server, 0, sizeof(server));
	server.sin_family = AF_INET;
	server.sin_port = htons(port);
	server.sin_addr.s_addr = htonl(INADDR_ANY);

	if (0 > bind(connfd, (struct sockaddr *)&server, sizeof(server)))
		err_exit("bind");
	
	char buf[BUFSIZ];
	struct sockaddr_in client;
	memset(&client, 0, sizeof(client));
	socklen_t len = sizeof(client);  /* must be done! */
	
	while(1) {
		recvfrom(connfd, buf, sizeof(buf), 0, (struct sockaddr *)&client, &len);
		printf("client(ip : %s, port : %d) : %s", inet_ntoa(client.sin_addr), ntohs(client.sin_port), buf);
		fgets(buf, sizeof(buf), stdin);
		sendto(connfd, buf, strlen(buf) + 1, 0, (struct sockaddr *)&client, sizeof(client));
	}
	close(connfd);
	exit(0);
}

 

 

 

 

 

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

网络编程之三 的相关文章

随机推荐

  • Python: 基于DearPyGUI的环境变量查看器

    文章目录 1 目的 2 效果 3 实现思路 获取环境变量 分隔环境变量取值 界面显示 4 代码实现 1 目的 无论是 Windows 还是 Linux 下 编辑环境变量总是绕不开的一个基本功 也许你已经熟练使用 vim 来查询和就地替换 P
  • npm下载依赖报错 Invalid dependency type requested: alias

    报这个是alias需要高版本的npm 查看一下npm版本 npm version alias这个好像得是6 9 0版本以上 我使用的是nvm管理node版本 我切换到12版本就可以了 成功安装 在此记录一下踩坑
  • 强化学习的模型

    文章目录 前言 一 强化学习是什么 二 基本模型 1 基本框架 2 学习过程 三 马尔科夫决策过程 Markov Decision Process MDP 1 马尔科夫性质 2 MDP的基本组成部分 3 MDP的基本流程 四 基于模型和免模
  • Tensorflow激活函数--tf.nn.dropout

    前言 激活函数 Activation Function 运行时激活神经网络中某一部分神经元 将激活信息向后传入下一层的神经网络 神经网络的数学基础是处处可微的 所以选取激活函数要保证数据输入与输出也是可微的 激励函数的作用 如果不使用激活函
  • 基于ARIMA算法的时间序列数据预测——matlab实现

    基于ARIMA算法的时间序列数据预测 matlab实现 时间序列分析是一种重要的数据分析方法 它可以对时间序列数据进行统计和预测 ARIMA Autoregressive Integrated Moving Average 是一种常用的时间
  • Spring boot ,dubbo整合异常

    Caused by java lang IllegalArgumentException java lang ClassCastException com guooo boot acc serv impl HelloDubboService
  • 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)

    综合案例2 0 蓝牙遥控小车1 语音控制 成品展示 案例说明 器件说明 小车连线 小车源码 语音模块遥控 语音遥控连线 模块使用说明 1 MLT BT05 4 0 蓝牙模块 2 ASRPRO 2m模块 下载代码连线 模块编程说明 成品展示
  • css设置内外边框距离

    margin属性可以有一到四个值 p gt margin 25px 50px 75px 100px 上边距为25px 右边距为50px 下边距为75px 左边距为100px margin 25px 50px 75px 上边距为25px 左右
  • Ubuntu20.04 安装 Tomcat 9.0.34

    最近开始使用 Ubuntu 在上面安装 Tomcat了 记录一下 具体步骤和直接在 CentOS 上面的差不多 一 解压安装包 tar zxvf apache tomcat 9 0 34 tar gz 二 修改目录所有权 用ll命令查询 修
  • PAT——团体程序设计天梯赛-练习集(5分题集)Python 3

    该博客记录我参加天梯赛 1 Hello World print Hello World 2 计算摄氏温度 print fahr 100 celsius format int 5 100 32 9 3 计算指数 n int input pri
  • Webservice接口数据抽取_kettel<一>

    在进行ETl数据抽取的时 有时会遇到Webservice接口服务的情况 这里对kettel工具和java脚本两种抽取方式来简单的介绍一下 由于篇幅较长 我分四篇来介绍 下一篇地址 Webservice接口数据抽取 kettel lt 二 g
  • xml 入门 shema_01

    shema基础 shema的使用 shema的属性和语法 相应的源码 1 shema的格式
  • Java静态代理、动态代理(JDK代理、CGLIB代理)常见面试题

    小结 静态代理不灵活 静态代理类似模板方法设计模式 动态代理灵活 方便 每个框架都会使用到 例如 spring中的AOP 默认为JDK实现方式 也可选择CGLIB实现方式 JDK动态代理只能代理实现接口的类或者直接代理接口 限制 必须要有接
  • 51单片机c语言随机函数,[转载]51单片机中生成随机数

    随机数在单片机的应用中也是很多的 当然产生随机数的方法有很多 当中有一个就是利用单片机定时器 取出未知的定时器THX和TLX的值 再加以运算得到一个规定范围内的随机数值 这做法也是可行的 或者预先写好一个随机数表 然后进行取数据 也是可以的
  • Web开发文稿

    前言 首先 目前主流开发工具有很多 而且更新迭代的速度非常迅速 所以这里只谈一些基础的概念 如前后端的交互到底是怎么交互的 这也是我在学习网页开发的很困惑的东西 一 我的开发工具 网页界面 html css 浏览器脚本 js 服务器脚本 p
  • android studio全局搜索 快捷键

    全局搜索 gt 项目下的APP目录 gt 右键 gt Find in path 快捷键 Ctrl h
  • 去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告

    版权声明 本文为博主原创文章 如需转载 请写明出处 尊重他人即尊重自己 http blog csdn net aubdiy article details 68485336 IntelliJ IDEA 打开 mybatis 的 xml 文件
  • 每天一个shell小知识(case)

    Case语句 case 结构 例1 case Case语句主要适用于 某个变量存在多种取值 需要对其中的每一种取值分别执行不同的命令序列 这种情况和多分支if语句非常相似 只不过if要判断多个不同的条件而case语句只判断一个变量的不同取值
  • Go Casbin 编写 MySQL适配器

    在 Go Casbin 中使用 MySQL 作为策略存储是一种常见的方式 下面是一个简单的示例 演示了如何在 Go Casbin 中使用 MySQL 首先 我们需要导入 MySQL 驱动程序和 Casbin import github co
  • 网络编程之三

    代码1 chat tcp client1 c include header h int main int argc char argv int connfd 1 if 0 gt connfd socket AF INET SOCK STRE