基于UDP(面向无连接)的socket编程
服务器(接收端)程序
1. 创建套接字(socket)
2. 将套接字绑定到一个本地地址和端口上(bind)
3. 等待接收数据(recvfrom)
4. 关闭套接字
客户端(发送端)程序
1. 创建套接字(socket)
2. 向服务器端发送数据(sendto)
3. 关闭套接字
控制台程序在使用之前须链接库数:工程->设置->Link->输入ws2_32.lib
控制台UDP服务器端收发消息
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库版本协商MSDN上有这个源码
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
//判断是否我们请求的winsocket版本,如果不是清除SOCKET后退出
if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
//2.创建套接字-----------SOCK_DGRAM数据报UDP
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
//3.服务器端绑定
bind (sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//申请变量
char recvBuf[100];
char sendBuf[100];
char tempBuf[100];
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
//服务器端循环接收
while(1)
{
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if('#'==recvBuf[0])
{
//表示客户端想要退出
sendto(sockSrv,"#",strlen("#")+1,0,(SOCKADDR*)&addrClient,len);
printf("Chat end!/n");
break;
}
sprintf(tempBuf,"%s say: %s", inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s/n",tempBuf);
printf("Please input data:/n");
//发送消息
gets(sendBuf);//可以得到一行数据
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len); }
closesocket(sockSrv);
WSACleanup();
}
控制台UDP客户端接收消息
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//版本号1.1
//1.加载套接字库版本协商MSDN上有这个源码
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
//判断是否我们请求的winsocket版本,如果不是清除SOCKET后退出
if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
//2.创建套接字-----------SOCK_DGRAM数据报UDP
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);
//3.填充结构体
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服务器地址
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
//申请变量
char recvBuf[100];
char sendBuf[100];
char tempBuf[200];
int len = sizeof(SOCKADDR);
//客户端循环接收
while (1)
{
//提示用户输入信息
printf("Please input data:/n");
gets(sendBuf);
//向服务器端发送消息
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*) &addrSrv,&len);
if('#' ==recvBuf[0])
{
//如果用户输入#终止套接字并向客户端发送消息
sendto(sockClient,"#",strlen("#")+1,0,(SOCKADDR*) &addrSrv,len);
printf("chat end!/n");
break;
}
//客户端显示发送内容
sprintf(tempBuf,"%s say: %s",inet_ntoa(addrSrv.sin_addr),recvBuf);
printf("%s/n",tempBuf);
}
//关闭套接字
closesocket(sockClient);
WSACleanup();
}