基于UDP(面向无连接)的socket编程
服务器端(接收端)程序:
1、创建套接字(socket)。
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。
客户端(发送端)程序:
1、创建套接字(socket)。
2、向服务器发送数据(sendto)。
3、关闭套接字。
客户端:
//------------------以下为服务器端程序--------------------------
#include <winsock.h>
//包含这个头文件,还要在在在project-setting-link中加上ws2_32.lib 这个链接库
#include <stdio.h>
void main()
{
//----------以下为加载套接字库-----------------
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//请求1.1版本的winsock库
//WSAStartup这个函数功能:1加载套接字库2进行版本协商
err = WSAStartup( wVersionRequested, &wsaData );//将版本信息放入wsaData结构体中
if ( err != 0 )
{
return;
}
//判断请求到的版本是不是1.1,不是的话
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1)
{
WSACleanup( );//清空结构
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);//新建socket,注意类型为数据报类型
//----------发送数据:用sendto函数-------
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);
sendto(sockClient,"HELLO",strlen("HELLO")+1,0,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
服务器端
//------------------以下为服务器端程序--------------------------
#include <winsock.h>
//包含这个头文件,还要在在在project-setting-link中加上ws2_32.lib 这个链接库
#include <stdio.h>
void main()
{
//----------以下为加载套接字库-----------------
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//请求1.1版本的winsock库
//WSAStartup这个函数功能:1加载套接字库2进行版本协商
err = WSAStartup( wVersionRequested, &wsaData );//将版本信息放入wsaData结构体中
if ( err != 0 )
{
return;
}
//判断请求到的版本是不是1.1,不是的话
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1)
{
WSACleanup( );//清空结构
return;
}
SOCKET socksrv=socket(AF_INET,SOCK_DGRAM,0);//新建socket,注意类型为数据报类型
//---------------绑定端口------------
SOCKADDR_IN addsrv;//SOCKADDR_IN地址结构
addsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//地址,注意:主机字节序转为网络字节序
addsrv.sin_family=AF_INET;//地址族
addsrv.sin_port=htons(6000);//端口号,1024以上,注意:主机字节序转为网络字节序
bind(socksrv,(SOCKADDR*)&addsrv,sizeof(SOCKADDR));
//----------接收数据:用recvfrom函数-------
SOCKADDR_IN addrclient;//客户端地址信息
int len =sizeof(SOCKADDR_IN);
char recvBuf[100];
recvfrom(socksrv,recvBuf,100,0,(SOCKADDR*)&addrclient,&len);
printf("%s",recvBuf);
closesocket(socksrv);
WSACleanup();
}