利用UDP发数据报的文章,自己稍微改了一下,在vc6.0下已经通过测试,程序如下。
//发送端程序
#include <stdio.h>
#include <winsock.h>
//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener; //创建套接字
SOCKADDR_IN saUdpServ; //指向通信对象的结构体指针
BOOL fBroadcast = TRUE; //用于setsockopt(),表示允许
char sendBuff[800]; //缓冲区存放发送的数据
int ncount = 0; //用于显示消息数目
//*************************** 第一步初始化Winsock *****************************//
if(WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) //进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop./n");//初始化失败返回-1
return -1;
}
//******************** 第二步建立一个数据报类型的UDP套接字 ******************//
sockListener = socket(PF_INET, SOCK_DGRAM, 0);
// setsockopt函数用于设置套接口选项
// 采用广播形式须将第三个参数设置为SO_BROADCAST
setsockopt(sockListener, SOL_SOCKET, SO_BROADCAST,(CHAR *)&fBroadcast, sizeof (BOOL));
// 参数设置,注意要将IP地址设为INADDR_BROADCAST,表示发送广播UDP数据报
saUdpServ.sin_family = AF_INET;
saUdpServ.sin_addr.s_addr = htonl(INADDR_BROADCAST);
saUdpServ.sin_port = htons(7001); //发送用的端口,可以根据需要更改
while(1) //循环发送数据
{
sprintf(sendBuff, "Message %d is: ok", ncount++); //将ncount的值放入字符串senBuff中
//********************** 第三步使用sendto函数进行通信 *************************//
sendto(sockListener,sendBuff, lstrlen(sendBuff), 0, (SOCKADDR *)&saUdpServ, sizeof(SOCKADDR_IN));
printf("%s/n", sendBuff); //将要广播的数据串输出
}
//********************* 第四步关闭socket ***************************************//
closesocket(sockListener); //关闭监听socket
WSACleanup();
return 0;
}
//接收端程序
#include <stdio.h>
#include <winsock.h>
#include <conio.h>
//创建新的套接字之前需要调用一个引入Ws2_32.dll库的函数,否则服务器和客户端连接不上
#pragma comment(lib,"ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsaData; //指向WinSocket信息结构的指针
SOCKET sockListener;
SOCKADDR_IN sin,saClient; //设置两个地址,sin用来绑定
//saClient用来从广播地址接收消息
char cRecvBuff[800]; //定义接收缓冲区
int nSize,nbSize;
int iAddrLen = sizeof(saClient);
if(WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) //进行WinSocket的初始化
{
printf("Can't initiates windows socket!Program stop./n");//初始化失败返回-1
return -1;
}
sockListener = socket(AF_INET, SOCK_DGRAM,0);
sin.sin_family = AF_INET;
sin.sin_port = htons(7001); //发送端使用的发送端口,可以根据需要更改
sin.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR FAR *)&sin, sizeof(sin))!=0)
{
printf("Can't bind socket to local port!Program stop./n");//初始化失败返回-1
return -1;
}
while(1)
{
nSize = sizeof(SOCKADDR_IN);
if((nbSize=recvfrom (sockListener,cRecvBuff, 800, 0,(SOCKADDR FAR *)&saClient,&nSize)) == SOCKET_ERROR) //若接收失败则提示错误
{
printf("Recive Error");
break;
}
cRecvBuff[nbSize] = '/0'; //字符串终止
printf("%s/n",cRecvBuff); //显示所接收到的字符串
}
return 0;
}
ZZ:http://blog.sina.com.cn/s/blog_4e03d7d701000di2.html