不考虑超时,无连接等情况的一个简单的例子。
生产使用要加入函数调用后的结果判断。
发送端
// 广播发送端.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdlib.h>
//#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>
#pragma comment (lib, "ws2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0) {
return;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup();
return;
}
SOCKET sockRrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
//addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.0.2");
addrSrv.sin_port = htons(6000);
addrSrv.sin_family = AF_INET;
char recvBuffer[100];
char sendBuffer[100];
char tempBuffer[100];
//SOCKADDR_IN addrClient;
int len = sizeof(sockaddr);
while (1)
{
printf("please input data:\n");
gets(sendBuffer);
sendto(sockRrv,sendBuffer,strlen(sendBuffer) + 1,0,(sockaddr*)&addrSrv,len);
recvfrom(sockRrv,recvBuffer,100,0,(sockaddr*)&addrSrv,&len);
if ('q' == recvBuffer[0])
{
sendto(sockRrv,"q",strlen("q") /*+ 1*/,0,(sockaddr*)&addrSrv,len);
printf("Chat end!\n");
break;
}
sprintf(tempBuffer,"%s say:%s",inet_ntoa(addrSrv.sin_addr),recvBuffer);
printf("%s\n",tempBuffer);
}
closesocket(sockRrv);
WSACleanup();
}
接收端
// 广播接收.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdlib.h>
//#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<winsock2.h>
#include<windows.h>
#include <iostream>
#pragma comment(lib, "Ws2_32.lib")
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0) {
return;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup();
return;
}
SOCKET sockRrv = socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_port = htons(6000);
addrSrv.sin_family = AF_INET;
bind(sockRrv,(SOCKADDR *)&addrSrv,sizeof(sockaddr));
//listen(sockRrv,5);
char recvBuffer[100];
char sendBuffer[100];
char tempBuffer[100];
SOCKADDR_IN addrClient;
int len = sizeof(sockaddr);
while (1)
{
recvfrom(sockRrv,recvBuffer,100,0,(sockaddr*)&addrClient,&len);
if ('q' == recvBuffer[0])
{
sendto(sockRrv,"q",strlen("q") /*+ 1*/,0,(sockaddr*)&addrClient,len);
printf("Chat end!\n");
break;
}
sprintf(tempBuffer,"%s say:%s",inet_ntoa(addrClient.sin_addr),recvBuffer);
printf("%s\n",tempBuffer);
printf("Please input data:\n");
gets(sendBuffer);
sendto(sockRrv,sendBuffer,strlen(sendBuffer) + 1,0,(sockaddr*)&addrClient,len);
}
closesocket(sockRrv);
WSACleanup();
}