当前位置: 首页 > article >正文

DAY1 网络编程(TCP客户端服务器)

作业:

        TCP客户端服务器。

server服务器代码:

#include <myhead.h>
#define  IP "192.168.110.52"
#define PORT 8886
#define BACKLOG 20
int main(int argc, const char *argv[])
{
	int oldfd=socket(AF_INET,SOCK_STREAM,0);//IPV4通信  TCP通信协议
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	//2.绑定IP和端口号
	struct sockaddr_in server=
	{
		.sin_family=AF_INET,//IPV4
		.sin_port=htons(PORT),//端口号转为网络字节序
		.sin_addr.s_addr=inet_addr(IP),//IP
	};
	if(bind(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
	{
		perror("bind");
		return -1;
	}
	//3.监听
	if(listen(oldfd,BACKLOG)==-1)
	{
		perror("listen");
		return -1;   
	}
	//4.接收客户端连接请求创建新的描述符用于通讯
	struct sockaddr_in client;//接收客户端信息的结构体
	socklen_t client_len=sizeof(client);//计算出结构体大小
	int newfd;
	newfd =accept(oldfd,(struct sockaddr*)&client,&client_len);
	if(newfd==-1)
	{
		perror("accept");
		return -1;
	}
	printf("%s发来连接请求\n",inet_ntoa(client.sin_addr));

	//5.循环收发信息
	char buff[1024];
	while(1)
	{
		memset(buff,0,sizeof(buff));
		int len=recv(newfd,buff,sizeof(buff),0);//0:非阻塞 MSG_DONTWAIT
		if(len==0)
		{
			printf("客户端断开连接\n");
			break;
		}
		printf("%s\n",buff);
		strcat(buff,"520");
		send(newfd,buff,sizeof(buff),0);
	}
	close(oldfd);
	close(newfd);
	return 0;
}

client客户端代码:

#include <myhead.h>
#define IP "192.168.110.52"
#define PORT 8886
int main(int argc, const char *argv[])
{
	int oldfd=socket(AF_INET,SOCK_STREAM,0);
	if(oldfd==-1)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in server=
	{
		.sin_family=AF_INET,
		.sin_port=htons(PORT),
		.sin_addr.s_addr=inet_addr(IP),
	};
	if(connect(oldfd,(struct sockaddr *)&server,sizeof(server))==-1)
	{
		perror("connect");
		return -1;
	}
	char buff[1024];
	while(1)
	{
		fgets(buff,sizeof(buff),stdin);
		buff[strlen(buff)-1]='\0';
		send(oldfd,buff,sizeof(buff),0);
		int len=recv(oldfd,buff,sizeof(buff),0);
		if(len==0)
		{
			printf("服务器意外退出\n");
			break;
		}
		printf("接收服务器:%s\n",buff);
	}
    close(oldfd);
	return 0;
}

Xmind知识点:


http://www.kler.cn/a/407789.html

相关文章:

  • 若依-一个请求中返回多个表的信息
  • 性能测试的宏观分析:全面提升系统表现的关键
  • Linux|内存级文件原理
  • SQL深入理解递归查询与层级结构的处理:以拼接ID路径为例
  • leetcode 50个简单和中等难度的题
  • JVM中TLAB(线程本地分配缓存区)是什么
  • Spring Boot入门——Spring Boot项目的创建
  • SpringBoot 集成 html2Pdf
  • Qt不同类之间参数的传递
  • ubuntu 配置 多个 git 客户端 账户
  • Modern Effective C++:Item 6 auto推导若非己愿,使用显式类型初始化惯用法
  • PostgreSQL技术内幕19:逻辑备份工具pg_dump、pg_dumpall
  • 【AI系统】GPU 架构回顾(从2010年-2017年)
  • Linux(1)
  • SparkSQL的执行过程:从源码角度解析逻辑计划、优化计划和物理计划
  • 前端:春节倒计时的简单实现
  • 在linux下用二进制方式安装mysql8
  • 5G NR:调制与编码策略(MCS)简介
  • C# 超链接控件LinkLabel无法触发Alt快捷键
  • 智能文档处理百宝箱,文档处理的必备利器
  • Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化
  • 学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P3 ~ P4)
  • uniapp实现开发遇到过的问题(持续更新中....)
  • 电脑使用——知乎、钉钉组件访问失败解决
  • 【tensorflow的安装步骤】
  • 数据结构-图的遍历