TCP程序与UDP程序
- 一 实验题目:TCP程序与UDP程序
- 二 实验目的
- 三 实验内容
- 四 实验步骤
- TCP服务器端的编写步骤:
- 现在让我们来看看网络程序客户端的编程步骤:
- 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关闭套接字即可。每个步骤都至关重要 ,要完成每个步骤的学习才可很好的完成本实验