欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > TCP/UDP实现网络通信

TCP/UDP实现网络通信

2024/10/24 5:24:05 来源:https://blog.csdn.net/2301_76740986/article/details/141139595  浏览:    关键词:TCP/UDP实现网络通信

TCP实现网络通信

1.服务端

#include<myhead.h>//1服务端定义:端口号\id号
#define SER_PIPR 6666
#define SER_IP "196.168.111.186"   //通过ifconfig查看ip
int main(int argc, const char *argv[])
{//1创建套接字int sfd =socket(AF_INET,SOCK_STREAM,0);if(sfd==-1){perror("socket error");return -1;}//2.将端口号快速重用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){perror("setsockipt error");return -1;}//2为套接字绑定端口号和ip//2.1填充地址结构体struct sockaddr_in sin;sin.sin_family=AF_INET;   //通信域名sin.sin_port=htons(SER_PIPR);  //端口号sin.sin_addr.s_addr=inet_addr(SER_IP);  //IP地址//2.2绑定工作if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("bind error");return -1;}//3.将套接字设置成被动监听状态if(listen(sfd,128)==-1){perror("listen error");return -1;}//4.阻塞等待客户的连接请求//4.1定义勇于接收客户端的信息struct sockaddr_in cin;//用于接收地址信息socklen_t addrlen = sizeof(cin);  //用于接收长度//4.2接收连接int newfd= accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd==-1){perror("accept error");return -1;}printf("[%s:%d]:已成功连接一个客户端\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));//5.数据的收发char buf[128]="";while(1){//清空容器bzero(buf,sizeof(buf));//从可读端读取信息int res=recv(newfd,buf,sizeof(buf),0);if(res==-1){perror("recv error");return -1;}else 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,"*_*");//将消息回复给客户端if(send(newfd,buf,strlen(buf),0)==-1){perror("发送error");return -1;}printf("发送成功\n");}//关闭监听close(sfd);return 0;
}

2.客户端

     1	#include<myhead.h>2	#define SER_PORT  6666 //与服务器保持一致3	#define SER_IP    "192.168.111.186"   //服务器ip地址4	5	#define CLI_PORT   8888  //客户端端口号6	#define CLI_IP    "192.168.111.186"    //客户端ip地址7	int main(int argc, const char *argv[])8	{9		//1.创建用于通信的套接字文件描述符10		int cfd=socket(AF_INET,SOCK_STREAM,0);11		if(cfd==-1)12		{13			perror("socket error");14			return -1;15		}16		printf("cfd = %d",cfd);17		//2.绑定ip地址和端口号18		//2.1填充地址信息结构体19		struct sockaddr_in cin;20		cin.sin_family = AF_INET;  //通信域21		cin.sin_port = htons(CLI_PORT); //端口号22		cin.sin_addr.s_addr = inet_addr(CLI_IP);   //ip地址23	24		//2.2绑定工作25		if(bind(cfd,(struct sockaddr*)&cin,sizeof(cin))==-1)26		{27			perror("bind error");28			return -1;29		}30		printf("bind success\n");31		32		//3.连接到服务器33		//3.1填充服务器地址信息结构体34		struct sockaddr_in sin;35		sin.sin_family=AF_INET;  //服务器的通信域36		sin.sin_port= htons(SER_PORT); //服务器端口号37		sin.sin_addr.s_addr=inet_addr(SER_IP);   //服务器ip地址38	39		//3.2连接服务器40		if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)41		{42			perror("connect error");43			return -1;44		}45		printf("连接服务器成功\n");46		//4.数据收发47		char buf[128]="";48		while(1)49		{50			printf("请输入>>>");51			fgets(buf,sizeof(buf),stdin);  //从终端获取字符串52			buf[strlen(buf)-1]=0;53	54			//将数据发送给服务器55			send(cfd,buf,strlen(buf),0);56			printf("发送成功\n");57	58			//清空容器59			bzero(buf,sizeof(buf));60	61			//接受服务器发来的的数据62			recv(cfd,buf,sizeof(buf),0);63	64			printf("收到服务器消息为:%s\n",buf);65	66		}67	68		//5.关闭套接字69		close(cfd);70		71		return 0;72	}

UDP实现网路通信

1.服务端

     1	#include<myhead.h>2	#define SER_PORT 9999  //服务器端口号3	#define SER_IP "192.168.111.186"  //服务器ip地址4	int main(int argc, const char *argv[])5	{6		//创建用于通信的服务器套接字描述符7		int sfd = socket(AF_INET,SOCK_DGRAM,0);8		if(sfd==-1)9		{10			perror("socket error");11			return -1;12		}13	14		printf("sfd = %d\n",sfd);15	16		//将端口号快速重用17		int resuse = 1;18		if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&resuse,sizeof(resuse))==-1)19		{20			perror("setsockopt error");21			return -1;22		}23	24		printf("将端口号快速重用成功\n");25	26		//2.绑定ip地址和端口号27		//2.1填充地址信息结构体28		struct sockaddr_in sin;29		sin.sin_family = AF_INET;   //通信域30		sin.sin_port = htons(SER_PORT);   //端口号31		sin.sin_addr.s_addr = inet_addr(SER_IP);  //IP地址32		//2.2绑定工作33		if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)34		{35			perror("bind error");36			return -1;37		}38	39		//3.数据收发40		char buf[128]="";41		struct sockaddr_in cin;             //接受对端地址信息42		socklen_t addrlen = sizeof(cin);     //接收地址长度43		while(1)44		{45			//清空容器46			bzero(buf,sizeof(buf));47	48			//从套接字中读取数据49			recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen);50			printf("收到的消息为:%s\n",buf);51	52			//收到的消息进行处理53			strcat(buf,"*_*");54	55			if(sendto(sfd,buf,strlen(buf),0,(struct sockaddr*)&cin,sizeof(cin))==-1)56			{57				perror("发送error");58				return -1;59			}60			printf("发送成功\n");61		}62		//4.关闭文件描述符63	64		return 0;65	}

2.客户端

思维导图:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com