网络编程 24/2/29 作业

1、思维导图

2、 tcp

复制代码
#include <myhead.h>
#define SER_IP "192.168.125.80"//服务器ip
#define SER_PORT 6789//服务器端口号

int main(int argc, const char *argv[])
{

	//创建用于监听的套接字
	int sfd=-1;
	sfd=socket(AF_INET,SOCK_STREAM,0);
	if(sfd==-1)
	{
		perror("socket error");
		return -1;
	}

	//绑定ip地址和端口号
	
	//1、填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr(SER_IP);
	//2、绑定
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
	
	//启动监听,允许客户端连接
	if(listen(sfd,128)==-1)
	{
		perror("listen error");
		return -1;
	}
	printf("listen success\n");

	//当客户端发送连接请求创建新的通信套接字
	struct sockaddr_in cin;//定义接受客户端地址信息的结构体
	socklen_t socklen=sizeof(cin);//接收客户端地址信息结构体的大小
	int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);
	if(newfd==-1)
	{
		perror("accept error");
		return -1;
	}
	printf("newfd=%d 您有新用户上线\n",newfd);
	printf("客户端ip:%s,端口号:%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));

	//通信套接字与客户端进行数据收发
	char rbuf[128]="";
	while(1)
	{
		//清空容器
		bzero(rbuf,sizeof(rbuf));
		//读取数据
		int res=recv(newfd,rbuf,sizeof(rbuf),0);
		if(res==0)
		{
			printf("用户已下线\n");
			break;
		}
		printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);
		//回复
		strcat(rbuf,"ovo");
		send(newfd,rbuf,strlen(rbuf),0);
	}

	//关闭套接字
	close(newfd);
	close(sfd);
	return 0;
}

#include <myhead.h>
#define SER_IP "196.168.125.80"
#define SER_PORT 6789
int main(int argc, const char *argv[])
{
	//创建用于通信的套接字描述符
	int cfd=socket(AF_INET,SOCK_STREAM,0);
	if(cfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("cfd=%d\n",cfd);
	//绑定(非必须)
	
	//连接服务器
	
	//填充要连接的服务器地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr(SER_IP);
	//连接服务器
	if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("connect error");
		return -1;
	}
	printf("connect success\n");
	//数据收发
	char wbuf[128]="";
	while(1)
	{
		//清空数据
		bzero(wbuf,sizeof(wbuf));
		printf("please enter:");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		//数据发送给服务器
		send(cfd,wbuf,strlen(wbuf),0);
		printf("send success\n");
		//接收消息
		bzero(wbuf,sizeof(wbuf));
		recv(cfd,wbuf,sizeof(wbuf),0);
		printf("u recv:%s\n",wbuf);
	}
	//关闭套接字文件
	close(cfd);
	return 0;
}

2、udp

复制代码
#include <myhead.h>
#define SER_IP "192.168.125.80"//服务器ip
#define SER_PORT 6789//服务器端口号

int main(int argc, const char *argv[])
{
	//创建通信套接字
	int sfd=socket(AF_INET,SOCK_DGRAM,0);
	if(sfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("sfd=%d\n",sfd);

	//绑定ip地址和端口号
	
	//1、填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr(SER_IP);
	//2、绑定
	if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");
	//3、收发数据
	
	char rbuf[128]="";//定义容器接收对端地址信息结构体
	struct sockaddr_in cin;
	socklen_t socklen=sizeof(cin);
	while(1)
	{
		//清空数组
		bzero(rbuf,sizeof(rbuf));
		//接收数据
		recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen);
		printf("u recv:%s\n",rbuf);
		//回复
		strcat(rbuf,"ovo");
		if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cin,socklen)==-1)
		{
			perror("sendto error");
			return -1;
		}
	}
	//关闭套接字
	close(sfd);
	return 0;
}

#include <myhead.h>
#define SER_IP "192.168.125.80"//服务器ip
#define SER_PORT 6789//服务器端口号

int main(int argc, const char *argv[])
{
	//创建通信套接字
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("cfd=%d\n",cfd);

	//绑定ip地址和端口号
	
	char wbuf[128]="";//定义容器记录服务器地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(SER_PORT);
	sin.sin_addr.s_addr=inet_addr(SER_IP);
	
	while(1)
	{
		//清空数组
		bzero(wbuf,sizeof(wbuf));
		//从终端获取数据
		printf("please enter:");
		fgets(wbuf,sizeof(wbuf),stdin);
		wbuf[strlen(wbuf)-1]=0;
		//发送数据给服务器
		sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&sin,sizeof(sin));
		printf("send success\n");
		//接收服务器回复的消息
		bzero(wbuf,sizeof(wbuf));
		recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);
		printf("u recv:%s\n",wbuf);
		//关闭套接字文件
		close(cfd);
	}
	return 0;
}
相关推荐
艾莉丝努力练剑7 分钟前
深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构
c语言·开发语言·c++·学习
晨非辰1 小时前
#C语言——学习攻略:自定义类型路线--结构体--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段
c语言·开发语言·经验分享·学习·其他·学习方法·visual studio
赵英英俊2 小时前
Python day43
开发语言·python
Warren982 小时前
公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
java·开发语言·前端·javascript·vue.js·python·安全
·白小白2 小时前
【数据结构】——栈(Stack)的原理与实现
c语言·开发语言·数据结构
野犬寒鸦3 小时前
Java Stream API 中常用方法复习及项目实战示例
java·服务器·开发语言·数据库
提笔惊蚂蚁3 小时前
Python 高级语法
开发语言·python
q567315234 小时前
使用reqwest+select实现简单网页爬虫
开发语言·爬虫·golang·kotlin
郝学胜-神的一滴4 小时前
C++中的`auto`与`std::any`:功能、区别与选择建议
开发语言·c++·程序人生·算法
血腥甘蔗4 小时前
下一代防火墙组网全解析
网络·智能路由器