网络编程 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;
}
相关推荐
JaguarJack14 分钟前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo17 分钟前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack15 小时前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay2 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954482 天前
CTF 伪协议
php
BingoGo4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack4 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack5 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack6 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端