Linux实验----TCP程序与UDP程序 实验六

一 实验题目:TCP程序与UDP程序

二 实验目的

掌握TCP程序和UDP程序的不同编写方法

三 实验内容

按要求完成程序调试,总结TCP程序和UDP程序编程的主要不同点

四 实验步骤

TCP服务器端的编写步骤:

1. 首先,你需要创建一个用于通讯的套接口,一般使用socket调用来实现。这等于你有了一个用于通讯的电话:) 
3. 然后,你需要给你的套接口设定端口,相当于,你有了电话号码。这一步 一般通过设 置网络套接口地址和调用bind函数来实现。 
4. 调用listen函数使你的套接口成为一个监听套接字。 以上三个步骤是TCP服务器的常用步骤。
5. 调用accept函数来启动你的套接字,这时你的程序就可以等待客户端的连接了。  
6. 处理客户端的连接请求。 
7. 中止连接

现在让我们来看看网络程序客户端的编程步骤:

 1.和服务器的步骤一样。 
 2通过设置套接口地址结构,我们说明,客户端要与之通讯的服务器的IP地址和端口。 
 3. 调用connect函数来连接服务器。 
 4. 发送或者接收数据,一般使用send和recv函数调用来实现。 
 5. 终止连接。

Tcp程序如下:


int main(int argc,char *argv[])
{ 
	int listensock,connsock; /定义两个socket套接字,一个用于监听,一个用于通讯
	struct sockaddr_in serveraddr; /定义网络套接字地址结构
	const char buff[] = "Hello! Welcome here!\r\n"; /定义要发送的数据缓冲区; 

	listensock = socket(AF_INET,SOCK_STREAM,0); /创建一个套接字,用于监听 
	bzero(&serveraddr,sizeof(servaddr)); /地址结构清零 
	serveraddr.sin_family = AF_INET; /指定使用的通讯协议族
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /指定接受任何连接,因为服务器不知道谁会要求连接 
	serveraddr.sin_port = htons(5000); /指定监听的端口
	bind(listensock,(sockaddr *)&serveraddr,sizeof(serveraddr)); /给套接口邦定地址 
	listen(listensock,1024); /开始监听 
     connsock = accept(listensock,(sockaddr *)NULL, NULL); /建立通讯的套接
	accept函数,等待客户端程序使用connect函数的连接
	send(connsock,buff,sizeof(buff), 0); /向客户端发送数据 
	close(connsock); /关闭通讯套接字 
	close(listensock); /关闭监听套接字   
}

这是客户端的程序:

int main(int argc,char **argv) 
{   
 	char recvbuff[100]; /定义要接收的数据缓冲区
 	int sockfd; /定义一个socket套接字,用于通讯
 	struct sockaddr_in serveraddr;/定义网络套接字地址结构
 	if(argc != 2){ 
  	printf("Usage: echo ip地址"); 
 	exit(0);
} 
	 sockfd = socket(AF_INET,SOCK_STREAM,0); /创建一个套接字
	bzero(&serveraddr,sizeof(serveraddr));
 	serveraddr.sin_family = AF_INET; /指定使用的通讯协议族 
 	serveraddr.sin_port = htons(5000);/指定要连接的服务器的端口 
 	inet_pton(AF_INET, argv[1], &serveraddr.sin_addr);
 	connect(sockfd,(sockaddr *)&serveraddr,sizeof(serveraddr)); /连接服务器
 	recv(sockfd,recvbuff,sizeof(recvbuff),0); /接收服务器的数据
 	printf("%s\n",recvbuff); /打印接收到的数据
  	close(sockfd); /关闭套接字
}

udp程序如下:

int port = 5500;
void main()
{
	 int sockfd; 
	 int count = 0;
	 int flag;
	 char buf[80];
	 struct sockaddr_in address; 
	 sockfd = socket(AF_INET, SOCK_DGRAM, 0); //看到不同的地方了吗?
	 memset(&address, 0, sizeof(address));
	 address.sin_family = AF_INET; 
	 address.sin_addr.s_addr = inet_addr("127.0.0.1");
	 address.sin_port = htons(port); 
	 flag = 1; 
	do{
		sprintf(buf,"Packet %d\n", count);
			if(count > 30)
			{ 
  		sprintf(buf,"over\n"); 
  		flag = 0; 
  		}
	   	sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&address,
	   	 sizeof(address)); // 发现了吗使用的函数不一样,它也是发送数据 
	  count++; 
	   }while (flag); 
} 

这是接收数据的程序:

char *hostname = "127.0.0.1"; //这个特殊的ip表示本的计算机 
void main() 
{ 
  int sinlen; 
  int port = 8080; 
  char message[256]; 
  int sockfd; 
  struct sockaddr_in sin; 
  struct hostent *server_host_name; // hostent结构有着机器的名字等信息 
  server_host_name = gethostbyname("127.0.0.1"); // 这个函数用来得到“127.0.0.1”的主机名字,也就是本机的名字
  bzero(&sin,sizeof(sin)); 
  sin.sin_family = AF_INET; 
  sin.sin_addr.s_addr = htonl(INADDR_ANY); 
  sin.sin_port = htons(port); 
  sockfd = socket(PF_INET,SOCK_DGRAM,0); //这里也不一样 
  bind(sockfd,(struct sockaddr *)&sin,sizeof(sin)); 
    while(1){
     sinlen = sizeof(sin); 
     recvfrom(sockfd,message,256,0, (struct sockaddr *)&sin,&sinlen);// 它是接受数据的函数 
     printf("\nData come from server:\n%s\n",message);
     if(strncmp(message,"over",4) ==0)break;
    } 
    close(sockfd); 
}

五实验结果

TCP:在这里插入图片描述

UDP
在这里插入图片描述
方法总结以上,结果可能调试有Bug;

六总结

本次实验考察socket编程,本章内容很重要也很繁琐,完成本实验要掌握创建套接字,服务器和客户端的区别,作为服务器要先bind函数绑定sockfd与本地协议地址,用linsten函数监听,accept函数从已连接的队列中取出链接。客户端要知道服务器的端口及ip地址,用connect函数与服务器链接,连接成功后用send函数发送数据。服务器接收数据则用recv函数,完成后用close关闭套接字即可。每个步骤都至关重要 ,要完成每个步骤的学习才可很好的完成本实验

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值