接收端:
#include<stdlib.h>
//#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<winsock2.h>
#include<windows.h>
#pragma comment (lib, "ws2_32.lib")
/*
HANDLE hr,hl,hbusy;
struct thrpar
{
SOCKET s;
};
struct recpar
{
SOCKET srec;
struct sockaddr_in addr;
};
UINT recthread(LPVOID pp)
{
SOCKET srec,s2;
struct recpar *prec=(struct recpar *)pp;
sockaddr_in recaddr;
srec=prec->srec;
recaddr=prec->addr;
char buf[256];
DWORD ret;
printf("recv thread start!");
ret=recv(srec,buf,256,0);
if(ret==0)
{
printf("connect close!");
closesocket(srec);
return 0;
}
else if(ret==SOCKET_ERROR)
{
printf("connect error!");
closesocket(srec);
return 0;
}
printf("recv data:%s",buf);
return 0;
}
DWORD WINAPI listhread(LPVOID pp)
{
::MessageBox(NULL,"enter the listhread","KK",MB_OK);
struct thrpar *pthr=(struct thrpar*)pp;
SOCKET sl,saccept;
sockaddr_in here, there;
char name[256];
struct hostent *phost;
int ret;
gethostname(name,256);
phost=gethostbyname(name);
here.sin_family=AF_INET;
here.sin_port=htons(1024);
here.sin_addr.S_un.S_un_b.s_b1=phost->h_addr_list[0][0];
here.sin_addr.S_un.S_un_b.s_b2=phost->h_addr_list[0][1];
here.sin_addr.S_un.S_un_b.s_b3=phost->h_addr_list[0][2];
here.sin_addr.S_un.S_un_b.s_b4=phost->h_addr_list[0][3];
sl=pthr->s;
ret=bind(sl,(struct sockaddr *)&here,sizeof(here));
if(ret!=0)
{
printf("bind error");
return 0;
}
ret=listen(sl,5);
if(ret!=0)
{
printf("listen error");
return 0;
}
while(true)
{
int nlen=sizeof(there);
saccept=accept(sl,(struct sockaddr *)&there,&nlen);
if(saccept==INVALID_SOCKET)
{
printf("accept socket invalid");
}
DWORD wret=WaitForSingleObject(hbusy,500);
if(wret==WAIT_TIMEOUT)
{
send(saccept,"\0",1,0);
closesocket(saccept);
continue ;
}
DWORD recid;
struct recpar *prec;
prec->addr=there;
prec->srec=saccept;
hr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&listhread,prec,0,&recid);
return 1;
}
return 1;
}
void main(void)
{
SOCKET s;
sockaddr_in addrin;
WSADATA wsdata;
BOOL bsocket;
char *smsg="this is a test";
WSAStartup(0x0202,&wsdata);
s=WSASocket(AF_INET,SOCK_STREAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
hbusy=CreateSemaphore(NULL,0,2,NULL);
struct thrpar *psc;
psc=new struct thrpar;
DWORD lisid;
psc->s=s;
hr=CreateThread(NULL,0,listhread,psc,0,&lisid);
DWORD ret=WaitForSingleObject(hr,10000);
if(ret==WAIT_OBJECT_0)printf("thread time out%d\r\n",lisid);
}*/
void main(void )
{
SOCKET s;
sockaddr_in from,a;
WSADATA wsdata;
BOOL optval;
//启?动??SOCKET库a,??版??本??为a2.0
WSAStartup(0x0202,&wsdata);
optval=TRUE;
//然??后??赋3值??给?两??个?地??址??,??一??个?用??来???绑???定??套???接??字??,??一??个?用??来???从???网??络?上??的??广?播??地??址??接??收??消?息??;??
a.sin_family=AF_INET;
a.sin_addr.s_addr=0;
a.sin_port=htons(5050);
from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);
int fromlength=sizeof (SOCKADDR);
//用??UDP初?始??化??套???接??字??
s=socket(AF_INET,SOCK_DGRAM,0);
//设???置?该?套???接??字??为a广?播??类???型??,??
setsockopt(s,SOL_SOCKET,SO_BROADCAST,( char FAR
*)&optval,sizeof (optval));
bind(s,(sockaddr *)&a, sizeof(sockaddr_in));
char buf[256];
while(1)
{ //从???广?播??地??址??接??收??消?息??,??注???意?a用??来???绑???定??的??地??址??和??接??收??消?息??的??地??址??是??不?一??样??的??
recvfrom(s,buf,256,0,( struct sockaddr
FAR *)&from,(int FAR
*)&fromlength);
Sleep(2000);
printf( "%s\n",buf);
ZeroMemory(buf,256);
}
}
发送端:
#include<stdlib.h>
//#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<winsock2.h>
#include<windows.h>
#pragma comment (lib, "ws2_32.lib")
int main()
{
SOCKET s;
sockaddr_in addrto;
WSADATA wsdata;
BOOL bsocket;
char *smsg="this
is a test wyj" ;
//启?动??SOCKET库a,??版??本??为a2.0
WSAStartup(0x0202,&wsdata);
s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_OVERLAPPED);
bsocket=TRUE;
//然??后??赋3值??给?地??址??,??用??来???从???网??络?上??的??广?播??地??址??接??收??消?息??;??
addrto.sin_family=AF_INET;
addrto.sin_addr.s_addr=INADDR_BROADCAST;
addrto.sin_port=htons(5050);
bool opt=true ;
//设???置?该?套???接??字??为a广?播??类???型??,??
setsockopt(s,SOL_SOCKET,SO_BROADCAST,( char FAR
*)&opt,sizeof (opt));
int nlen=sizeof (addrto);
while(1)
{
Sleep(1000);
//从???广?播??地??址??发???送??消?息??
int ret=sendto(s,smsg,strlen(smsg),0,(sockaddr*)&addrto,nlen);
if(ret==SOCKET_ERROR)
printf( "Error:%s\n",
WSAGetLastError());
else
{
printf( "ok");
}
}
return -1;
}