Witam wszystkich!
Pragnąc rozszerzyć swoje umiejętności w socketach natknąłem się na problem, otóż chciałem stworzyć aplikacja która by wysyłała dany pakiet do servera na danym porcie i sockecie.
Jednym słowem jest to podpięcie się pod klienta który ma już wygenerowany socket.
Aktualny kod programu:
#include <winsock.h>
#include <iostream.h>
#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]={0x6c,0x6f,0x6c}; // komunikat
int iMessageLen;
int ret;
char szInBuffer[128];
int iBufferLen;
char szAddress[64]="213.248.126.85"; // IP servera
int iPort;
SOCKET s; // uzywane gniazdo
SOCKADDR_IN addr; // adres hosta
// pobranie adresu IP
cout << "Podaj adres IP do ktorego wyslac (np. 127.0.0.1) ...\n";
//cin.getline(szAddress,64,'\n');
// port na ktorym sie komunikujemy (0...65535)
iPort = 5555; // Port servera
// pobranie komunikatu do bufora
cout << "Wpisz komunikat ...";
//cin.getline(szMessage,80,'\n');
// dlugosc komunikatu
iMessageLen = strlen(szMessage);
cout << "Len: " << iMessageLen << endl; // Wyswietla dlugosc komunikatu
// zaladuj WinSock w wersji 2.2
WSAStartup(MAKEWORD(2,2), &wsda);
// stworzenie gniazda TCP
s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
cout << "Socket: "<< s << endl ; // Wyswietlenie socketu
// sprawdzenie bledu
if(s == SOCKET_ERROR)
{
cout << "Blad przy inicjalizacji gniazda : " << WSAGetLastError() << 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);
// laczenie z serwerem
cout << "Laczenie z hostem " << szAddress << " na porcie " << iPort << endl;
ret = connect(s, (struct sockaddr *) &addr, sizeof(addr));
// sprawdzenie bledu
if(ret == SOCKET_ERROR)
{
cout << "Blad przy laczeniu z serwerem : " << WSAGetLastError() << endl;
system("PAUSE");
exit(1);
}
// wyslanie komunikatu
cout << "Wysylanie pakietu..." << endl;
ret = send(s, szMessage, iMessageLen, 0);
// sprawdzenie bledu
if(ret == SOCKET_ERROR)
{
cout << "Blad przy wysylaniu komunikatu : " << WSAGetLastError() << endl;
system("PAUSE");
exit(1);
}
// odbior komunikatu zwrotnego
cout << "Oczekiwanie na komunikat zwrotny..." << endl;
ret = recv(s, szInBuffer, sizeof(szInBuffer), 0);
// sprawdzenie bledu
if(ret == SOCKET_ERROR)
{
cout << "Blad przy odbiorze komunikatu zwrotnego : " << WSAGetLastError() << endl;
system("PAUSE");
exit(1);
}
// wyswietlenie komunikatu zwrotnego
iBufferLen = ret;
szInBuffer[iBufferLen] = '\0';
cout << "Otrzymano komunikat o tresci \"" << szInBuffer << "\" od hosta " << szAddress << endl;
// zamkniecie gniazda
closesocket(s);
// zamkniecie WinSock
WSACleanup();
system("PAUSE");
return 0;
}
Program kompiluje się bez problemu po czym jest generowany wolny socket po czym wysyła do servera pakiet, po wysłaniu program odbiera odpowiedź od servera po czym zamyka socket.
Za pomocą programu snifferskiego WPE PRO łapałem aktualny Socket który używa aplikacja ip oraz port. Niestety gdy próbuję utworzyć połączenie na tym samym sockecie dostaję odmowę dostępu od WSA kod błędu 10038.
Próbowałem też bindować socketa lecz bez skutku, prosiłbym o waszą pomoc z moim problemem.
Chcę tylko połączyć się do servera na tym samym Sockecie co aplikacja by móc w łatwy sposób wysłać własne pakiety.
Pozdrawiam,
Kameha