Discussion:
C++ sockets, blad :/
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
b***@gmail.com
2007-05-17 16:23:18 UTC
Permalink
Witam
Przy pomocy Beej's Guide to Network Programming (http://beej.us/guide/
bgnet/output/html/multipage/index.html) napisalem taki kod:

#include <winsock2.h>
#include <iostream>
#define DEST_IP "127.0.0.1"
#define DEST_PORT 80

int main() {
SOCKET gniazdo;
SOCKET polaczenie;
struct sockaddr_in dest_addr;

gniazdo = socket(PF_INET, SOCK_STREAM, 0);
std::cout << gniazdo << std::endl;

dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(DEST_PORT);
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
memset(&(dest_addr.sin_zero), '\0', 8);

polaczenie = connect(gniazdo, (struct sockaddr *)&dest_addr,
sizeof(struct sockaddr));
std::cout << polaczenie << std::endl;
char *msg = "lol";
int len = std::strlen(msg);
std::cout << "msg: " << msg << std::endl;
std::cout << "len: " << len << std::endl;
int bytes_sent = send(gniazdo, msg, len, 0);
std::cout << bytes_sent << std::endl;
closesocket(gniazdo);
return 0;
}


zwraca on (u mnie):

4294967295
4294967295
msg: lol
len: 3
-1

1. dlaczego zwraca blad przy wysylaniu czegos do socketa?
2. czy wysylajac na port 80 i odpowiedni adres naglowek HTTP moge
uzyskac dane z tego serwera uzywajac funkcji recv() ?

Pozdrawiam
ionic
2007-05-17 17:17:45 UTC
Permalink
Prace z socketami nalezy zaczac od WSAStartup() (na platformie Win32).
4294967295 to nic innego jak -1, czyli INVALID_SOCKET
b***@gmail.com
2007-05-19 07:50:14 UTC
Permalink
Post by ionic
Prace z socketami nalezy zaczac od WSAStartup() (na platformie Win32).
4294967295 to nic innego jak -1, czyli INVALID_SOCKET
Czyli jak powinien wygladac kod?
Co przekazuje jako paramatry WSAStartup()?
ionic
2007-05-19 08:20:35 UTC
Permalink
WSADATA wsd;
WSAStartup(0x202, &wsd);

202h to wesja winsocka której chcesz uzyc, tutaj 2.2.
Po zakonczenu pracy z socketami wypadaloby wykonac WSACleanup(void).
b***@gmail.com
2007-05-19 08:35:00 UTC
Permalink
Witam

mam juz taki kod:

#include <winsock2.h>
#include <stdio.h>
#include <iostream>
#define DEST_IP "127.0.0.1"
#define DEST_PORT 80

WSADATA wsaData;
WORD wersja;
int blad;
char bufff[500];

int main() {
wersja = MAKEWORD(2,0);
blad = WSAStartup(wersja, &wsaData );
if ( blad != 0 )
{
printf( "blad!");
return 1;
}

;

SOCKET gniazdo;
SOCKET polaczenie;
struct sockaddr_in dest_addr;

gniazdo = socket(PF_INET, SOCK_STREAM, 0);
std::cout << gniazdo << std::endl;

dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(DEST_PORT);
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
memset(&(dest_addr.sin_zero), '\0', 8);

polaczenie = connect(gniazdo, (struct sockaddr *)&dest_addr,
sizeof(struct sockaddr));
std::cout << "polaczenie: " << polaczenie << std::endl;
char *msg = "GET /aaa.txt HTTP/1.1\r\n";
int len = std::strlen(msg);
std::cout << "msg: " << msg << std::endl;
std::cout << "len: " << len << std::endl;
int bytes_sent = send(gniazdo, msg, len, 0);
std::cout << "bytes sent: " << bytes_sent << std::endl;
memset(bufff, 0, sizeof(bufff));
std::cout << "zadeklarowano" << std::endl;
int odebrane = recv(gniazdo, bufff, sizeof(bufff), 0);

closesocket(gniazdo);
WSACleanup();
return 0;
}

zwraca on:
1956
polaczenie: 0
msg: GET /aaa.txt HTTP/1.1

len: 23
bytes sent: 23
zadeklarowano
#tu program sie zawiesza, czeka na odbior nadych?

Co robie zle jesli chce pobrac zawartosc tego pliku z internetu?
Tomek[TK]
2007-05-19 09:24:31 UTC
Permalink
Post by b***@gmail.com
SOCKET gniazdo;
SOCKET polaczenie
O ile dobrze pamietam, do polaczenia z serwerem nie sa Ci potrzebne dwa
gniazda. Zostanmy przy socket'cie "gniazdo" - drugie gniazdo wywal.
Post by b***@gmail.com
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
Rozumiem, ze masz serwer http, na tej samej maszynie co odpalasz klienta?
Post by b***@gmail.com
polaczenie = connect(gniazdo, (struct sockaddr *)&dest_addr,
sizeof(struct sockaddr));
jestes pewien tego sizeof(struct sockaddr)?

connect nie zwraca socket'a tylko numer bledu.
Post by b***@gmail.com
char *msg = "GET /aaa.txt HTTP/1.1\r\n";
Znowu nie mam pewnosci, ale zapytanie powinno sie konczyc \r\n\r\n

Zreszta nie wyglada ono na poprawne, nie tylko z tego powodu.
--
Tomek
http://www.osiedle-er.prv.pl/
Marcin 'Qrczak' Kowalczyk
2007-05-19 11:05:49 UTC
Permalink
Post by b***@gmail.com
#tu program sie zawiesza, czeka na odbior nadych?
Co robie zle jesli chce pobrac zawartosc tego pliku z internetu?
http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
--
__("< Marcin Kowalczyk
\__/ ***@knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
b***@gmail.com
2007-05-22 16:46:52 UTC
Permalink
Witam
przy zapetleniu tego programu zwykla petla while(true) {} dostaje taki
komunikat:

"This application has requested the Runtime to terminate it in an
unusual way.
Please contact the application's support team for more information."

Jak sprawić by program zadziałał?
b***@gmail.com
2007-05-22 18:45:06 UTC
Permalink
Witam
przy zapetleniu tego programu zwykla petla while(true) {} dostaje taki
komunikat:

"This application has requested the Runtime to terminate it in an
unusual way.
Please contact the application's support team for more information."

Jak sprawić by program zadziałał?

Loading...