基于UDP的网络聊天程序

思路

基于UDP面向无连接的socket编程的发送端程序流程如下:
(1)创建套接字socket。

(2)将套接字绑定(bind)到一个本地地址和端口上。

(3)等待接收数据(recvfrom)。

(4)释放套接字资源(closesocket)。

基于UDP面向无连接的socket编程的接收端程序流程如下:

(1)创建套接字socket。

(2)向服务器发送数据(sendto)。

(3)释放套接字资源(closesocket)。

一、服务器端代码

#include<stdio.h>
#include<winsock.h>							/*引入winsock头文件*/

int  main()
{
	/*------------------------------------------------------------------*/
	/*----------------------定义变量--------------------------------*/
	/*------------------------------------------------------------------*/
	char Receivebuf[100];					/*接受数据的缓冲区*/
	int length;

	SOCKET socket_send;					/*定义套接字*/
	SOCKADDR_IN Server_add;				/*服务器地址信息结构*/
	SOCKADDR_IN Client_add;				/*客户端地址信息结构*/

	WORD wVersionRequested;				/*字(word):unsigned short*/
	WSADATA wsaData;					/*库版本信息结构*/
	int error;							/*表示错误*/

	/*------------------------------------------------------------------*/
	/*-------------------------初始化套接字库---------------------------*/
	/*------------------------------------------------------------------*/
				/*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/
	wVersionRequested = MAKEWORD( 2, 2 );	
				/*加载套接字库,初始化Ws2_32.dll动态链接库*/
	error = WSAStartup( wVersionRequested, &wsaData);	
	if(error!=0)
	{
		printf("加载套接字失败!");
		return 0;							/*程序结束*/
	}
				/*判断请求加载的版本号是否符合要求*/
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
		   HIBYTE( wsaData.wVersion ) != 2 ) 
	{	
		WSACleanup( );					/*不符合,关闭套接字库*/
		return 0;							/*程序结束*/
	}

	/*创建套接字*/
	socket_send=socket(AF_INET,SOCK_DGRAM,0);

	/*----------------------设置服务器地址-----------------------*/
	Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/
	Server_add.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	Server_add.sin_port=htons(5000);/*端口号*/

	/*绑定套接字*/
	bind(socket_send,(SOCKADDR*)&Server_add,sizeof(SOCKADDR));
	
	length=sizeof(SOCKADDR);

	recvfrom(socket_send,Receivebuf,100,0,(SOCKADDR*)&Client_add,&length);
	
	printf("%s\n",Receivebuf);

	/*------------------------------------------------------------------*/
	/*-----------------------释放套接字,关闭动态库----------*/
	/*------------------------------------------------------------------*/
	closesocket(socket_send);				/*释放套接字资源*/
	WSACleanup();							/*关闭动态链接库*/
	return 0;
}

在程序运行之前,要添加 ws2_32.lib
在这里插入图片描述

二、客户端端代码

#include<stdio.h>
#include<winsock.h>							/*引入winsock头文件*/

int  main()
{
	/*------------------------------------------------------------------*/
	/*----------------------定义变量--------------------------------*/
	/*------------------------------------------------------------------*/
	SOCKET socket_client;				/*定义套接字*/
	SOCKADDR_IN Server_add;				/*服务器地址信息结构*/

	WORD wVersionRequested;				/*字(word):unsigned short*/
	WSADATA wsaData;					/*库版本信息结构*/
	int error;							/*表示错误*/

	/*------------------------------------------------------------------*/
	/*-------------------------初始化套接字库---------------------------*/
	/*------------------------------------------------------------------*/
				/*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/
	wVersionRequested = MAKEWORD( 2, 2 );	
				/*加载套接字库,初始化Ws2_32.dll动态链接库*/
	error = WSAStartup( wVersionRequested, &wsaData);	
	if(error!=0)
	{
		printf("加载套接字失败!");
		return 0;							/*程序结束*/
	}
				/*判断请求加载的版本号是否符合要求*/
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
		   HIBYTE( wsaData.wVersion ) != 2 ) 
	{	
		WSACleanup( );					/*不符合,关闭套接字库*/
		return 0;							/*程序结束*/
	}

	/*创建套接字*/
	socket_client=socket(AF_INET,SOCK_DGRAM,0);

	/*----------------------设置服务器地址-----------------------*/
	Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/
	Server_add.sin_addr.S_un.S_addr = inet_addr("192.168.1.238");
	Server_add.sin_port=htons(5000);/*端口号*/

	sendto(socket_client,"ILoveChina",strlen("ILoveChina")+1,0,(SOCKADDR*)&Server_add,sizeof(SOCKADDR));
	/*------------------------------------------------------------------*/
	/*-----------------------释放套接字,关闭动态库----------*/
	/*------------------------------------------------------------------*/
	closesocket(socket_client);				/*释放套接字资源*/
	WSACleanup();							/*关闭动态链接库*/
	return 0;
}

在程序运行之前,要添加 ws2_32.lib

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dlz0836

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值