Re: [Dev-C++] Dev-cpp-users Digest, Vol 16, Issue 12
Open Source C & C++ IDE for Windows
Brought to you by:
claplace
From: Per W. <pw...@ia...> - 2007-10-03 09:51:26
|
Don't reply to me - reply to all, or at least to the list. Still html mail. Notice below what my mail client does with it. Very, very easy to read... You are also still claiming that Infobuf is a buffer. No, it is not. It is a pointer. A pointer doesn't store data. It stores the address to data. Notice that the LP in LPSOCKADDR stands for Large Pointer. The next funny thing is that the last parameter you send - then one that on input should specify the size of your buffer, and on output should contain the actually used size - is an int pointer. And you called it Buf. It should be an int variable, or more specifically a socklen_t variable. It should be named something like buffer_size. You should take the address of it and send as parameter. If the expected answer may be as large as a SOCKADDR, then you need a buffer at least as large as a SOCKADDR. The address of this buffer (and the sizeof() this buffer) may be used as parameters to getpeername(). Sending it an uninitialized pointer and saying that you can only accept an asnwer as large as a pointer will never manage you to get any results back. In this case, the OS is nice and catches your error. The OS could just as well have killed your application. This is an usage example - directly awailable from google. It is for Unix, but the important concents are the same. int s; struct sockaddr_in server, addr; socklen_t len; // make a socket s =3D socket(PF_INET, SOCK_STREAM, 0); // connect to a server server.sin_family =3D AF_INET; inet_aton("63.161.169.137", &server.sin_addr); server.sin_port =3D htons(80); connect(s, (struct sockaddr*)&server, sizeof server); // get the peer name // we know we just connected to 63.161.169.137:80, so this should print: // Peer IP address: 63.161.169.137 // Peer port : 80 len =3D sizeof addr; getpeername(s, (struct sockaddr*)&addr, &len); printf("Peer IP address: %s\n", inet_ntoa(addr.sin_addr)); printf("Peer port : %d\n", ntohs(addr.sin_port)); /pwm On Tue, 2 Oct 2007, angel dario wrote: > Can you give me a small example because i tried to point to the buffer wi= th no success: > > my function: > > sockaddr *Y_YGetPeerName(SOCKET Client){ LPSOCKADDR Infobuf; int = *Buf =3D (int*)sizeof(SOCKADDR*); if(getpeername(Client,Infobuf,Buf) !=3D= 0) { cout<<"GetPeerName error"<<endl; } else { cout<<"GetPeerNam= e Success"<<endl; } cout<<WSAGetLastError();} > > > > > > Date: Wed, 3 Oct 2007 01:52:59 +0200> From: pw...@ia...> To: s= cie...@ho...> CC: dev...@li...> Sub= ject: Re: [Dev-C++] Dev-cpp-users Digest, Vol 16, Issue 12> > First of all = - please avoid using HTML on the mailing list.> > Second - you should send = a pointer to a buffer to the function.> > You are sending a pointer, but th= at pointer does not point to any> buffer... Declare a variable of the corre= ct type and then use the> address-of operator.> > /pwm> > On Tue, 2 Oct 200= 7, angel dario wrote:> > >> > Any body knows how to use:> >> > getpeername(= ) function on dev-cpp???> >> > I tried it and WSAGetLastError() always retu= rn to 10014.> > _________________________________________________________________ > Boo!=A0Scare away worms, viruses and so much more! Try Windows Live OneCa= re! > http://onecare.live.com/standard/en-us/purchase/trial.aspx?s_cid=3Dwl_hot= mailnews |