badphantom
05.05.2008, 16:13
Hi,
ich versuche gerade, nach diese Tutorial http://www.codeproject.com/KB/IP/beginningtcp_cpp.aspx
eine Verbindung per TCP/IP aufzubauen.
Das Problem liegt jetzt bei den "asynchronen Sockets" (so wird das dort genannt).
Der Code des Tutorials sieht so aus:
BOOL CALLBACK DlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
lParam)
{
switch(Message)
{
case WM_INITDIALOG:
{
//Our dialog box is being created
hwnd = hdwnd;
hStatus = GetDlgItem(hdwnd, ID_STATUS_MAIN);
}
return TRUE;
//Winsock related message...
case 1045:
switch (lParam)
{
case FD_CONNECT: //Connected OK
MessageBeep(MB_OK);
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Connection Established.");
break;
case FD_CLOSE: //Lost connection
MessageBeep(MB_ICONERROR);
//Clean up
if (s) closesocket(s);
WSACleanup();
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Connection to Remote Host Lost.");
break;
case FD_READ: //Incoming data to receive
char buffer[80];
memset(buffer, 0, sizeof(buffer)); //Clear the buffer
recv (s, buffer, sizeof(buffer)-1, 0); //Get the text
GetTextandAddLine(buffer, hwnd, ID_EDIT_DATA); //Display it
break;
case FD_ACCEPT: //Connection request
{
MessageBeep(MB_OK);
SOCKET TempSock = accept(s, (struct sockaddr*)&from, &fromlen);
s = TempSock; //Switch our old socket to the new one
char szAcceptAddr[100];
wsprintf(szAcceptAddr, "Connection from [%s] accepted.",
inet_ntoa(from.sin_addr));
SendMessage(hStatus, SB_SETTEXT, 0,
(LPARAM)szAcceptAddr);
}
break;
}
break;
(...)Jetzt verwende ich aber keine Dialogbox, und das ganze sollte eigentlich im Hintergrund laufen.
Wenn ich das richtig verstehe, wird diese "BOOL CALLBACK DlgProc(...)" als Eventhandler aufgerufen.(?)
Wie kann ich das denn jetzt ohne WinAPI ( also WinFenster) realisieren?
Komme da auf keinen grünen Zweig.
Bei mir sieht es so aus:
int ListenOnPort(int portno) // wird von main aufgerufen; sofort bei start (?)
{
(...)
printf("socket ok..\n");
if ( s == INVALID_SOCKET)
{
return false;
}
if (bind(s,(LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
return false;
listen(s,SOMAXCONN);
printf("listening started");
// Handler ...
int length=sizeof(addr);
printf("accept connection..\n");
accept(s,(sockaddr*)&addr,&length);
}
=====
C++ ; MSVS .NET (2005)
ich versuche gerade, nach diese Tutorial http://www.codeproject.com/KB/IP/beginningtcp_cpp.aspx
eine Verbindung per TCP/IP aufzubauen.
Das Problem liegt jetzt bei den "asynchronen Sockets" (so wird das dort genannt).
Der Code des Tutorials sieht so aus:
BOOL CALLBACK DlgProc(HWND hdwnd, UINT Message, WPARAM wParam, LPARAM
lParam)
{
switch(Message)
{
case WM_INITDIALOG:
{
//Our dialog box is being created
hwnd = hdwnd;
hStatus = GetDlgItem(hdwnd, ID_STATUS_MAIN);
}
return TRUE;
//Winsock related message...
case 1045:
switch (lParam)
{
case FD_CONNECT: //Connected OK
MessageBeep(MB_OK);
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Connection Established.");
break;
case FD_CLOSE: //Lost connection
MessageBeep(MB_ICONERROR);
//Clean up
if (s) closesocket(s);
WSACleanup();
SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)"Connection to Remote Host Lost.");
break;
case FD_READ: //Incoming data to receive
char buffer[80];
memset(buffer, 0, sizeof(buffer)); //Clear the buffer
recv (s, buffer, sizeof(buffer)-1, 0); //Get the text
GetTextandAddLine(buffer, hwnd, ID_EDIT_DATA); //Display it
break;
case FD_ACCEPT: //Connection request
{
MessageBeep(MB_OK);
SOCKET TempSock = accept(s, (struct sockaddr*)&from, &fromlen);
s = TempSock; //Switch our old socket to the new one
char szAcceptAddr[100];
wsprintf(szAcceptAddr, "Connection from [%s] accepted.",
inet_ntoa(from.sin_addr));
SendMessage(hStatus, SB_SETTEXT, 0,
(LPARAM)szAcceptAddr);
}
break;
}
break;
(...)Jetzt verwende ich aber keine Dialogbox, und das ganze sollte eigentlich im Hintergrund laufen.
Wenn ich das richtig verstehe, wird diese "BOOL CALLBACK DlgProc(...)" als Eventhandler aufgerufen.(?)
Wie kann ich das denn jetzt ohne WinAPI ( also WinFenster) realisieren?
Komme da auf keinen grünen Zweig.
Bei mir sieht es so aus:
int ListenOnPort(int portno) // wird von main aufgerufen; sofort bei start (?)
{
(...)
printf("socket ok..\n");
if ( s == INVALID_SOCKET)
{
return false;
}
if (bind(s,(LPSOCKADDR)&addr, sizeof(addr)) == SOCKET_ERROR)
return false;
listen(s,SOMAXCONN);
printf("listening started");
// Handler ...
int length=sizeof(addr);
printf("accept connection..\n");
accept(s,(sockaddr*)&addr,&length);
}
=====
C++ ; MSVS .NET (2005)