网络编程-day4

使用IO多路复用实现TCP并发服务器

TCP服务器端、客户端实现收发

cs 复制代码
#include <head.h>
//tcp服务器端


#define SER_PORT 8888      //服务器端口号
#define SER_IP  "192.168.144.131"   //服务器IP
int main(int argc, const char *argv[])
{
	//创建套接字文件描述符
	int sfd = socket(AF_INET,SOCK_STREAM,0);
	if(sfd == -1 )  //判断是否创建成功
	{
		perror("sfd error");
		return -1;
	}
	printf("sfd=%d\n",sfd);   //输出用于连接的套接字文件描述符

	//端口号重启用
	int reuse = 1;     
	if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)  
	{
		perror("setsockopt errror");
		return -1;
	}
	printf("端口号重启用\n");

	//定义一个结构体sin来绑定文件描述符与端口号/IP
	//
	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(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");

	//定义一个对端结构体来接收客户端IP、端口号
	struct sockaddr_in cin;
	socklen_t addrlen=sizeof(cin);

	//阻塞状态,等待其他客户端连接
	int newfd=accept(sfd,(struct sockaddr *)&cin,&addrlen);
	if(newfd==-1)
	{
		perror("newfd error");
		return -1;
	}
	printf("[%s:%d]-连接成功:newfd=%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);


	//实现数据的收发
	char buf[128]="";
	while(1)
	{
		bzero(buf,sizeof(buf));
		int res=recv(newfd,buf,sizeof(buf),0);
		if(res==0)
		{
			printf("客户端下线\n");
			close(newfd);
			break;
		}
		printf("[%s:%d]发送:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);

		strcat(buf,"*_*");
		send(newfd,buf,sizeof(buf),0);
		printf("发送成功\n");
	}

	close(sfd);
	return 0;
}
cs 复制代码
#include <head.h>
//tcp客户端

#define SER_PORT 8888   //服务器端口号
#define SER_IP "192.168.144.131"  //服务器IP
#define KH_PORT  7777  //客户端端口号
#define KH_IP  "192.168.144.131"  //客户端IP
int main(int argc, const char *argv[])
{
	//创建一个套接字文件描述符
	int cfd=socket(AF_INET,SOCK_STREAM,0);
	if(cfd==-1)
	{
		perror("cfd error");
		return -1;
	}
	printf("cfd=%d\n",cfd);
	

	//定义结构体cin来绑定套接字文件描述符与端口号/IP的绑定
	struct sockaddr_in cin;
	cin.sin_family=AF_INET;
	cin.sin_port=htons(KH_PORT);
	cin.sin_addr.s_addr=inet_addr(KH_IP);

	//端口号重应用
	int reuse=1;
	if(setsockopt(cfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1)
	{
		perror("setsockopt error");
		return -1;
	}
	printf("端口重启用\n");

	//绑定套接字文件描述符
	if(bind(cfd,(struct sockaddr *)&cin,sizeof(cin))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success\n");


	//定义一个用来接收对端IP、端口号的结构体sin
	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 buf[128]="";
	while(1)
	{
		bzero(buf,sizeof(buf));
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;
		if(strcmp(buf,"quit")==0)
		{
			printf("客户端断开连接\n");
			break;
		}


		send(cfd,buf,sizeof(buf),0);
		
		bzero(buf,sizeof(buf));
		int res=recv(cfd,buf,sizeof(buf),0);
		if(res==0)
		{
			printf("服务器下线\n");
			break;
		}
		printf("服务器发送:%s\n",buf);
		
		printf("接收成功\n");
	}
	close(cfd);
	return 0;
}

UDP服务器端、客户端实现收发

cs 复制代码
#include <head.h>
//udp服务器端
#define SER_IP   "192.168.144.131"
#define SER_PORT  8888
int main(int argc, const char *argv[])
{
    int sfd=socket(AF_INET,SOCK_DGRAM,0);
    if(sfd==-1)
    {
        perror("sfd error");
        return -1;
    }
    printf("sfd=%d\n",sfd);

    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(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)
    {
        printf("bind error");
        return -1;
    }
    printf("bind success\n");
        
    
    char buf[128]="";
    struct sockaddr_in cin;
    socklen_t addrlen=sizeof(cin);

    while(1)
    {
        bzero(buf,sizeof(buf));
        recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,&addrlen);
        printf("[%s:%d]发送:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);

        strcat(buf,"*_*");
        sendto(sfd,buf,sizeof(buf),0,(struct sockaddr *)&cin,sizeof(cin));
        printf("发送成功\n");
    
    }
    close(sfd);
    return 0;
}
cs 复制代码
#include <head.h>

#define SER_IP "192.168.144.131"
#define SER_PORT  8888
int main(int argc, const char *argv[])
{
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;
	sin.sin_addr.s_addr=inet_addr(SER_IP);
	sin.sin_port=htons(SER_PORT);
	socklen_t addrlen =sizeof(sin);

	char buf[128]="";
	while(1)
	{
		bzero(buf,sizeof(buf));
		fgets(buf,sizeof(buf),stdin);
		buf[strlen(buf)-1]=0;
		if(strcmp(buf,"quit")==0)
		{
			printf("退出\n");
			break;
		}
		sendto(cfd,buf,sizeof(buf),0,(struct sockaddr *)&sin,addrlen);
		printf("发送成功\n");


		recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr *)&sin,&addrlen);
		printf("[%s:%d]-发送:%s\n",inet_ntoa(sin.sin_addr),ntohs(sin.sin_port),buf);
	}

	close(cfd);
	return 0;
}
相关推荐
莫回首�18 小时前
ubuntu 20.04 多网卡配置,遇到问题总结
linux·网络·ubuntu
星辰徐哥1 天前
5G的行业应用:工业互联网、车联网、智慧医疗中的网络支撑
网络·5g·php
头疼的程序员1 天前
计算机网络:自顶向下方法(第七版)第八章 学习分享(三)
网络·学习·计算机网络
@insist1231 天前
网络工程师-核心考点:网络管理体系与 SNMP 协议全解析
网络·智能路由器·网络工程师·软考·软件水平考试
我科绝伦(Huanhuan Zhou)1 天前
分享一个网络智能运维系统
运维·网络
codeejun1 天前
每日一Go-44、Go网络栈深度拆解--从 TCP 到 HTTP 的资源复用艺术
网络·tcp/ip·golang
北京耐用通信1 天前
无缝衔接·高效传输——耐达讯自动化CC-Link IE转Modbus TCP核心解决方案
网络·人工智能·物联网·网络协议·自动化·信息与通信
亚空间仓鼠1 天前
OpenEuler系统常用服务(五)
linux·运维·服务器·网络
聊点儿技术1 天前
CDN调度失准导致跨省流量浪费?在GSLB层用IP归属地查询实现精准就近接入
网络·ip·ip归属地查询·ip地址查询·ip离线库·cdn调度