гм... чего-то у меня не получается..
есть демон-сервер, который отсылает обратно все, что ему приходит:
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>
#define PORT 666 // ???? ???????
#define sHELLO "Hello, %s [%s] Sailor\n"
int main(int argc, char* argv[]) {
char buff[1024];
printf("UDP DEMO echo-Server\n");
// ??????????? ??????????
if (WSAStartup(0x202,(WSADATA *) &buff[0])) {
printf("WSAStartup error: %d\n",WSAGetLastError());
return -1;
}
// ???????? ??????
SOCKET my_sock;
my_sock=socket(AF_INET,SOCK_DGRAM,0);
if (my_sock==INVALID_SOCKET) {
printf("Socket() error: %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
// ?????????? ?????? ? ????????? ???????
sockaddr_in local_addr;
local_addr.sin_family=AF_INET;
local_addr.sin_addr.s_addr=INADDR_ANY;
local_addr.sin_port=htons(PORT);
if (bind(my_sock,(sockaddr *) &local_addr, sizeof(local_addr))) {
printf("bind error: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
setsockopt(my_sock,SOL_SOCKET,SO_BROADCAST,&buff[0],sizeof(buff)-1);
// ????????? ???????, ?????????? ?????????
while(1) {
sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);
int bsize=recvfrom(my_sock,&buff[0],sizeof(buff)-1,0,
(sockaddr *) &client_addr, &client_addr_size);
if (bsize==SOCKET_ERROR) {
printf("recvfrom() error: %d\n",WSAGetLastError());
}
// ?????????? IP-????? ??????? ? ?????? ????????
HOSTENT *hst;
hst=gethostbyaddr((char *) &client_addr.sin_addr,4,AF_INET);
printf("+%s [%s:%d] new DATAGRAM!\n",
(hst)?hst->h_name:"Unknown host",
inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
// ????????? ??????????? ????
buff[bsize]=0;
// ????? ?? ?????
printf("C=>S:%s\n",&buff[0]);
// ??????? ?????????? ???????
sendto(my_sock,&buff[0],bsize,0,
(sockaddr *)&client_addr, sizeof(client_addr));
}
return 1;
}
эта штука работает.
с другой стороны, есть клиент, котрый оттсылает все, что полчит из консольной строоки, потом деон ему это возвращает обратно и он это еще раз выводит на экран.
так же я создал еще один поток, в котором хочу рассылать широковещательные сообщения, получать их од демона и печатать.
но демон их не принимает...
наверное они не отсылаются?...
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include "functions.h"
#define PORT 666
#define SERVERADDR "127.0.0.1"
int main(int argc, char* argv[]) {
char buff[10*1014];
printf("UDP DEMO Client\nType quit to quit\n");
// ???????????? ?????????? Winsocks
if (WSAStartup(0x202,(WSADATA *)&buff[0])) {
printf("WSAStartup error: %d\n",WSAGetLastError());
return -1;
}
// ???????? ??????
SOCKET my_sock=socket(AF_INET, SOCK_DGRAM, 0);
if (my_sock==INVALID_SOCKET) {
printf("socket() error: %d\n",WSAGetLastError());
WSACleanup();
return -1;
}
//????? ????????? ? ????????
HOSTENT *hst;
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
// ??????????? IP-?????? ????
if (inet_addr(SERVERADDR)) {
dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
{ else {
if (hst=gethostbyname(SERVERADDR)) {
dest_addr.sin_addr.s_addr=((unsigned long **) hst->h_addr_list)[0][0];
{ else {
printf("Unknown host: %d\n",WSAGetLastError());
closesocket(my_sock);
WSACleanup();
return -1;
}
}
struct ch1 data_ch1;
data_ch1.my_sock = &my_sock;
data_ch1.dest_addr = dest_addr;
//////////////////
SOCKET sock;
char *buf="aaaaaaa";
int bufsz=7;
char len;
struct sockaddr_in sa;
sock=socket(PF_INET,SOCK_DGRAM,0);
sa.sin_family=AF_INET;
//sa.sin_addr.s_addr=htonl(0x0a000001); /* 10.0.0.1 */
sa.sin_addr.s_addr=inet_addr(SERVERADDR);
sa.sin_port=htons(137); /* ;) */
bind(sock,(struct sockaddr*)&sa,sizeof(sa)); /* ?????????? ?? ??????? ??????? ?????+???? */
len=1;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,&len,sizeof(len)); /* ???????? bc - ?????? ??? ???????????, ?.?. ethernet ?????? ???? ?????? ???? bc*/
//sa.sin_addr.s_addr=htonl(0x0a0000ff); /* 10.0.0.255 */
sa.sin_addr.s_addr=inet_addr("127.0.0.255");
len=sizeof(sa);
// sendto(sock,buf,bufsz,0,(struct sockaddr*)&sa,sizeof(sa)); /* ???? ????? ??????? ??? ????? ? ???? 10.0.0.0/24 */
struct ch1 dataDemon;
dataDemon.my_sock = &sock;
dataDemon.dest_addr = sa;
//////////////////
HANDLE hThreads[3];
unsigned uThreadIDs[3];
hThreads[1] = (HANDLE) _beginthreadex(NULL,0,sendData, &data_ch1,0,&uThreadIDs[1]);
hThreads[2] = (HANDLE) _beginthreadex(NULL,0,receiveData, &my_sock,0,&uThreadIDs[2]);
hThreads[0] = (HANDLE) _beginthreadex(NULL,0,runDemon, &dataDemon,0,&uThreadIDs[0]);
WaitForMultipleObjects(3, hThreads, TRUE, INFINITE );
CloseHandle( hThreads[0] );
CloseHandle( hThreads[1] );
CloseHandle( hThreads[2] );
// ??? ????????? - ?????
closesocket(my_sock);
closesocket(sock);
WSACleanup();
return 0;
}
функции :
unsigned __stdcall receiveData (void * arg) {
SOCKET * my_sock = (SOCKET *)arg;
// ????? ????????? ? ???????
char buff[10*1014];
sockaddr_in server_addr;
int server_addr_size=sizeof(server_addr);
int n;
sockaddr_in client_addr;
int client_addr_size = sizeof(client_addr);
HOSTENT *hst;
while(1) {
n=recvfrom(*my_sock,&buff[0],sizeof(buff)-1,0,
(sockaddr *) &server_addr, &server_addr_size);
/* if (n==SOCKET_ERROR) {
printf("recvfrom() error: %d\n",WSAGetLastError());
closesocket(*my_sock);
WSACleanup();
break;
}
*/
if (n != SOCKET_ERROR) {
buff[n]=0;
// ????? ????????? ? ??????? ????????? ?? ?????
printf("S=>C:%s",&buff[0]);
}
}
_endthreadex( 0 );
return 0;
}
unsigned __stdcall sendData(void * arg) {
ch1 * data_ch1 = (ch1*)arg;
while(1) {
char buff[10*1014];
// ?????? ????????? ? ??????????
printf("S<=C:");fgets(&buff[0],sizeof(buff)-1,stdin);
if (!strcmp(&buff[0],"quit\n")) {
_endthreadex( 0 );
return 0;
}
// ???????? ????????? ?? ??????
sendto(*(data_ch1->my_sock), &buff[0], strlen(&buff[0]), 0,
(sockaddr *) &(data_ch1->dest_addr), sizeof(data_ch1->dest_addr));
}
_endthreadex( 0 );
return 0;
}
unsigned __stdcall runDemon(void * arg) {
ch1 * data_ch1 = (ch1*)arg;
char *buf="aaaaaaa";
int bufsz=7;
while(1) {
sendto(*(data_ch1->my_sock),buf,bufsz,0,
(sockaddr *) &(data_ch1->dest_addr), sizeof(data_ch1->dest_addr));
//delay(3000);
}
_endthreadex( 0 );
return 0;
}
и
struct ch1 {
SOCKET * my_sock;
sockaddr_in dest_addr;
};
вот...
я все же думаю, что я неправильно рассылаю широковещательные сообщения....
не так?..
p.s. я все это пытаюсь тестиить через localhost