Mam program:
#include <winsock.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
//using namespace std;
int main(int argc, int **argv)
{
WSADATA wsda; // informacja zwrocona przez WSAStartup
struct hostent *host; // informacja o serwerze
char szMessage[80]; // komunikat
int iMessageLen;
int ret;
char szAddress[64];
int iPort;
SOCKET s; // uzywane gniazdo
SOCKADDR_IN addr,remote_addr;// adres hosta
int iRemoteAddrLen; // objetosc struktury adresu
int dudp;
struct timeval tv;
fd_set zb;
tv.tv_sec = 2;
tv.tv_usec = 500000;
// pobranie adresu IP
std::cout << "Podaj adres IP do ktorego wyslac (np. 127.0.0.1) ...";
std::cin.getline(szAddress,64,'\n');
// port na ktorym sie komunikujemy (0...65535)
iPort = 1000;
// pobranie komunikatu do bufora
std::cout << "Wpisz komunikat ...";
std::cin.getline(szMessage,80,'\n');
// dlugosc komunikatu
iMessageLen = strlen(szMessage);
// zaladuj WinSock w wersji 2.2
WSAStartup(MAKEWORD(2,2), &wsda);
// stworzenie gniazda UDP
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
dudp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// sprawdzenie bledu
if(s == SOCKET_ERROR)
{
std::cout << "Blad przy inicjalizacji gniazda : " << WSAGetLastError() << std::endl;
system("PAUSE");
exit(1);
}
// informacja o hoscie
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = inet_addr(szAddress);
if(addr.sin_addr.s_addr == INADDR_NONE) // jesli nie podano numeru IP, to odnajdz go z DNS
{
std::cout << "Nie podado numeru IP" << std::endl;
system("PAUSE");
exit(1);
}
iRemoteAddrLen = sizeof(remote_addr);
while(1) {
// wyslanie komunikatu
std::cout << "Wysylanie komunikatu..." << std::endl;
ret = sendto(s, szMessage, iMessageLen, 0, (struct sockaddr *) &addr, sizeof(addr));
// sprawdzenie poprawnosci wyslania
if(ret == SOCKET_ERROR)
{
std::cout << "Blad przy wysylaniu komunikatu." << std::endl;
system("PAUSE");
exit(1);
}
std::cout << "Komunikat o tresci \"" << szMessage << "\" zostal wyslany do " << szAddress << std::endl;
std::cout << "Oczekiwanie na pakiet z zewnatrz " << std::endl;
FD_ZERO(&zb);
FD_SET(dudp, &zb);
// nie martw się o writefds i exceptfds:
ret = select(dudp, &zb, NULL, NULL, &tv );
if (ret > 0) {
if (FD_ISSET(dudp, &zb)) {
ret = recvfrom(s, szMessage, iMessageLen, 0, (struct sockaddr *) &remote_addr, &iRemoteAddrLen);
std::cout << "Otrzymano: " << szMessage << std::endl;
}
}
}
// zamkniecie gniazda
closesocket(s);
// zamkniecie WinSock
WSACleanup();
system("PAUSE");
return 0;
}
I jak uruchamiam go na dwóch komputerach w sieci, wpisując przy tym takie numery IP, aby programy wysylaly do siebie nawzajem komunikaty, bo programy nie pokazuja że odebrały coś od komputera z drugiej strony.
Co mam źle w programie ?