|
Hi
I have a server app that I'm developing. When I call the bind function that is in my BindStructOnSocket function, depending how I filled my sockaddr_in structure, occurs an different error.
If I fill my sockaddr_in.sin_addr field like this :
<br />
SocketStruct->sin_addr.s_addr = INADDR_ANY;<br />
When I call accept function my app enters in a infinite loop.
If I fill my sockaddr_in.sin_addr field like this :
<br />
char cName[30];<br />
gethostname(cName, 30);<br />
hostent * theHost;<br />
theHost = gethostbyname(cName);<br />
SocketStruct->sin_family = AF_INET;<br />
SocketStruct->sin_port = htons(2500);<br />
SocketStruct->sin_addr = *((in_addr*)theHost->h_addr_list);<br />
When I call accept I get the WSAEADDRNOTAVAIL error.
My queswtion is WHY?
I'm developing this with Visual C++ 6
Below my code
Tks for the support
<br />
SOCKET CreateSocket()<br />
{<br />
SOCKET theSocket;<br />
WORD wVersion = MAKEWORD(2, 0);<br />
WSADATA wsStartup;<br />
WSAStartup(wVersion, &wsStartup);<br />
theSocket = socket(AF_INET, SOCK_STREAM, 0);<br />
if(theSocket == INVALID_SOCKET)<br />
{<br />
MessageBox(NULL, "Socket não criado", "Erro", MB_ICONERROR|MB_OK);<br />
return INVALID_SOCKET;<br />
}<br />
return theSocket;<br />
}<br />
<br />
void CreateSocketStruct(sockaddr_in * SocketStruct)<br />
{<br />
SocketStruct->sin_family = AF_INET;<br />
SocketStruct->sin_port = htons(2500);<br />
SocketStruct->sin_addr.s_addr = INADDR_ANY;<br />
for(int i = 0 ; i < 8 ; i++) SocketStruct->sin_zero[i] = 0;<br />
char * cTemp;<br />
cTemp = inet_ntoa(SocketStruct->sin_addr);<br />
MessageBox(NULL, cTemp, "", MB_OK);<br />
}<br />
<br />
int BindStructOnSocket(SOCKET currSocket, sockaddr_in * SocketInfo)<br />
{<br />
int iTemp = bind(currSocket, (sockaddr*)SocketInfo, sizeof(sockaddr));<br />
if(iTemp != 0)<br />
{<br />
int i = WSAGetLastError();<br />
char cTemp[5];<br />
if(i == WSAEADDRNOTAVAIL)MessageBox(NULL, "", "Erro", MB_OK);<br />
}<br />
return iTemp;<br />
}<br />
|
|
|
|
|
The second method won't work if there's no adapter associated with the address you specify.
The first method (using INADDR_ANY) should be correct. There's maybe something wrong with your
accept processing.
Is this the server's listening socket you are using the above code on?
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Mark Salsbery wrote: Is this the server's listening socket you are using the above code on?
Exactly, I'm testing this code in my house but the problem persists
|
|
|
|
|
So once your listening socket is bound and listening, there's an infinite loop on accept?
Do you mean it just sits (blocked) in the accept() call?
Assuming your socket(), bind(), and listen() calls all succeed (no errors) then this is the
correct behavior for a blocking socket when you call accept(). accept() will block until there's
a connect request.
Mark
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
No, there aren't an infinite loop on accept. And yeah, it just sits in the accept call.
|
|
|
|
|
Then it is working as written.
I'm guessing you need that to be asynchronous instead of halting the thread, correct?
If so, you can do one of these:
1) Leave the listener socket in blocking mode and put the accept call in a different thread.
2) Use WSAAsyncSelect() to place the socket in non-blocking mode and get a window message when
a connection attempt is received. Then call accept() in response.
3) Use WSAEventSelect() to place the socket in non-blocking mode and have an event signalled when
a connection attempt is received. Then call accept() in response (also requires a separate thread
to be effective).
4) Use an IO Completion Port (advanced).
*edit* Fixed some typnig.
Mark
-- modified at 17:33 Thursday 1st March, 2007
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
5) Buy your Fish Filet at McDonalds
led mike
|
|
|
|
|
Indeed! Dammit now I'm hungry.
"Great job, team. Head back to base for debriefing and cocktails."
(Spottswoode "Team America")
|
|
|
|
|
Where Name is a BSTR:
TRACE("\nFIELD[%d]: %s",j,(LPCTSTR)Name);
or
TRACE("\nFIELD[%d]: %s",j,Name);
Both just print the first char??
Anders G
|
|
|
|
|
i think this will do it: TRACE("%S", myBeaster);
|
|
|
|
|
It did! Thanks!! This basic stuff is slowly polluting our pure C++ world
|
|
|
|
|
a BSTR is a UTF-16 (or is it UCS2? can't remember) encoded string. This means that each character is a 2 byte word. The ASCII character set fits within a single byte of each word. As such, from a char* point of view, a BSTR is basically a string with a \0 character between every character. Hence you get only the first character.
|
|
|
|
|
%S will work as long as you are calling an ANSI trace function. %S means "a string in the character set opposite of the current TCHAR character set". To make it work in all cases, use %ls instead.
|
|
|
|
|
Anders Gustafsson wrote: Where Name is a BSTR:
TRACE("\nFIELD[%d]: %s",j,(LPCTSTR)Name);
TRACE("\nFIELD[%d]: %s",j,(LPCTSTR)_bstr_t(Name));
|
|
|
|
|
Hi All.
Can anyone tell me how to change a text in an edit box of an other process programmatically (maybe using SetWindowsHook or something else) I want it to work on Win9x and WinXP
thanks
|
|
|
|
|
SendMessage(....)
led mike
|
|
|
|
|
See if its helpfuls
char *MY="Hello";
HWND hWnd = ::FindWindow("Notepad", NULL);
CWnd *hWndEdit=FindWindowEx(hWnd,NULL,"Edit",NULL);
::SendMessage(hWndEdit->m_hWnd,WM_SETTEXT,0,(long)MY);
|
|
|
|
|
// CEdit m_edit;
m_edit.SetWindowText ("your text");
|
|
|
|
|
He said on the other program not his program
|
|
|
|
|
lucy wrote:
m_edit.SetWindowText ("your text");
but for that you have get handle of that Edit Box
|
|
|
|
|
NOTE: I am posting this message here because i dont have access to suggestion forum as i lost my email account password and for that you need to be able to log on to your mail id. So kindly accept this letter and try not to go against my appeal. If you are not agree with whatever i said and you want me to change my opinion then please email me at crook_martin2000@yahoo.co.uk and do not reply to this post here.
I apologise for any inconvenience caused to other users of this mind blowing site.
Thanks for your support.
Dear Author,
I appreciate all the efforts you took to get this site up and running but i dont like the way you have developed the forum section.
when anyone who replies to any post, then that post should come up on the top whereas new messages keep on adding and the old message goes back to 3-4 pages and most of us dont even care to look more then 2-3 pages back.
For instance look at this forum site,
http://www.nabble.com/port-xen-f12400.html
How beautifully they have managed it without making it a mess, whereas this site forum just looks a big mess.
Please take steps to change the design of this forum as we all need this great forum but would appreciate its proper use.
Thanks and Regards
Programmer
|
|
|
|
|
Software_Specialist wrote: most of us dont even care to look more then 2-3 pages back.
Yup we never get stuck up with the history
Press: 1500 to 2,200 messages in just 6 days? How's that possible sir?
Dr.Brad :Well,I just replied to everything Graus did and then argued with Negus for a bit.
|
|
|
|
|
hey tell me,
we both know together, don't we ?
oh, and for those who missed This one[^], fire is opened guyz
|
|
|
|
|
|