Avatar billede dj-meisner Nybegynder
31. juli 2005 - 00:55 Der er 39 kommentarer

c++ sockets hjæælp

Hey!!!!!!!!
hvordan connecter jeg til fx. localhost med porten 1337 og udskriver et data til serveren.. fx.. "SEND,hej!!,30,30,30"

og bagefter udskriver den outputtet?
Avatar billede mollevp Nybegynder
31. juli 2005 - 01:13 #1
Her er en virkelig god guide.. hvis du hellere bare vil se noget kode er der nogle eksempler i bunden af siden jeg tror du vil kunne bruge..

\\Morten
Avatar billede bertelbrander Praktikant
31. juli 2005 - 01:13 #2
Der har lige været et spørgsmål:
http://www.eksperten.dk/spm/636189

Det burde være trivielt at ændre koden til at gøre det du ønsker.
Avatar billede mollevp Nybegynder
31. juli 2005 - 16:06 #3
hov glemte sku da linket.. :)

www.beej.us/guide

og så tag hans guide til network programming.. Jeg synes selv hans skriver kanont godt - han er pisse sjov..

"As you learn C, those bite-sized pieces will correspond to function calls or statements that you will have learned. As you learn to program in general, those bite-sized pieces will start corresponding to larger algorithms that you know (or can easily look up.)

Right now, you might not know any of the pieces that you have at your disposal. That's ok. The fastest way to learn them is to, right now, press the mouse to your forehead and say the password, "K&R2".

That didn't work? Hmmm. There must be a problem with the system somewhere. Ok, we'll do it the old-school way: learning stuff by hand."

taget fra hans guide til C :)
Avatar billede mollevp Nybegynder
31. juli 2005 - 16:07 #4
"Ooooo! Prostrate yourself, mortal, in the face of The Specification!

Ok, maybe I'm being a little too overdramatic here. But I wanted to stress just mildly and subtly, if you might indulge me, that The Specification BWHAHAHA *THUNDERCLAP* (Sorry! Sorry!) is something you should spend time absorbing before your fingers touch the keyboard. Except for checking your mail and reading Slashdot, obviously. That goes without saying."

Jeg elsker det :)
Avatar billede dj-meisner Nybegynder
02. august 2005 - 01:26 #5
det er c++ (dev c++!!!!))!!! ikke alt det andet lort.. vil bare have det jeg sagde så får i opoint! kan ikke engelsk
Avatar billede bertelbrander Praktikant
02. august 2005 - 01:30 #6
Dev-c++ er ikke det samme som C++, alt det andet er ikke nødvendigvis l...

Jeg tror at det bliver svært at lære om sockets hvis ikke du kan lidt engelsk.
Avatar billede dj-meisner Nybegynder
02. august 2005 - 01:31 #7
gu er det da så..
man bruger << cout "hsadhasdasd"; til at udskrive en tekst med!
Avatar billede dj-meisner Nybegynder
02. august 2005 - 01:31 #8
http://www.eksperten.dk/spm/636619 - giv link til download!
Avatar billede bertelbrander Praktikant
02. august 2005 - 22:19 #9
Du kan prøve følgende:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <errno.h>

void get(char *hostname,int port,char *Msg)
{
  int sd,status,len,ix;
  char resp[51200];
  struct sockaddr local;
  BOOL Flag = TRUE;
  /* create socket */
  sd=socket(AF_INET,SOCK_DGRAM,0);
  if(sd<0) {
      printf("Error creating socket: %s\n",strerror(errno));
      goto fin;
  }
  /* bind socket */
  local.sa_family=AF_INET;
  memset(local.sa_data,0,sizeof(local.sa_data));
  setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&Flag, sizeof(Flag));
  status=bind(sd,&local,sizeof(local));
  if(status<0) {
      printf("Error binding socket: %s\n",strerror(errno));
      goto fin;
  }
  struct sockaddr_in sockaddr;
  memset((char *)&sockaddr, 0, sizeof(sockaddr));
  sockaddr.sin_family = AF_INET;
  sockaddr.sin_addr.s_addr = inet_addr(hostname);

  if(sockaddr.sin_addr.s_addr == INADDR_NONE)
  {
    printf("Failed to convert IPAddress!");
    goto fin;
  }
  sockaddr.sin_port = htons(port);

  status = sendto(sd, Msg, strlen(Msg), 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
  if(status < 0)
  {
      printf("Error sending message: %d\n", WSAGetLastError());
      goto fin;
  }
  /* read response */
  ix = 0;
  len = recv(sd, resp + ix, sizeof(resp) - ix - 1, 0);
  resp[len]='\0';
  printf("%s", resp);
fin:
  closesocket(sd);
  return;
}

int main()
{
  WSADATA WSAData;
  WSAStartup(0x0101,&WSAData);
  get("192.168.2.187", 1337, "SEND,hej!!,30,30,30");
  WSACleanup();
  printf("Hit enter to exit\n");
  getchar();
  return 0;
}

Det er en lettere omskrivning af Arne's program som jeg linkede til.
Du skal linke med ws2_32

Hvad sidder der på port 1337?

Er det noget i den stil du ønsker?
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:29 #10
C:\DOCUME~1\Ejer\LOKALE~1\Temp\ccEjbaaa.o(.text+0x9f) In function `Z3getPciS_':
  [Linker error] undefined reference to `socket@12'
  [Linker error] undefined reference to `setsockopt@20'
  [Linker error] undefined reference to `bind@12'
  [Linker error] undefined reference to `inet_addr@4'
  [Linker error] undefined reference to `htons@4'
  [Linker error] undefined reference to `sendto@24'
  [Linker error] undefined reference to `WSAGetLastError@0'
  [Linker error] undefined reference to `recv@16'
  [Linker error] undefined reference to `closesocket@4'
C:\DOCUME~1\Ejer\LOKALE~1\Temp\ccEjbaaa.o(.text+0x321) In function `main':
  [Linker error] undefined reference to `WSAStartup@8'
  [Linker error] undefined reference to `WSACleanup@0'
Avatar billede bertelbrander Praktikant
11. august 2005 - 21:37 #11
I menu'en vælger du Options -> Compiler Options.
På Directories tabben sætter du X i "Add the following commmand when calling the compiler", og skriver: -lws2_32 i boxen derunder.

På linker tabben fjerner du X i "Compile for Win32 (no console)"
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:38 #12
har i dansk... kan du oversætte.. eri kke god til engelsk.!
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:40 #13
fx.
get("side.dk", 89, "SEND,hej!!,30,30,30");

virker ikke
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:40 #14
har lavet selv..  "På linker tabben fjerner du X i "Compile for Win32 (no console)"" behøves jeg ikke.. det virker nu, men kan den ikke connecte til en side istedet for en ip?
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:41 #15
den siger
Failed to convert IPAddress!
Avatar billede bertelbrander Praktikant
11. august 2005 - 21:42 #16
Jo, man kan godt få den til at connekte til en side.
Hvad er det programmet skal?
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:46 #17
hvis du er rigtig sød vil jeg gerne have det til ligesom sådan noget:
http://www.upitfree.dk/upload/files/PROGRam.gif
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:47 #18
det behøves ikke være med grafik, men hvis du er kvik så kan du lave der hvor:

man skriver en kommando - skal baggrunden være command.gif

ved output = output.gif
ved nyhederne = nyheder.gif

ved submit = submitKnap.gif


på forhånd takker!
Avatar billede bertelbrander Praktikant
11. august 2005 - 21:57 #19
Jeg kan godt prøve om jeg kan strikke det sammen, det vil lige tage lidt tid (en dag eller 2).

Er der en side jeg kan bruge til at teste med?
Avatar billede dj-meisner Nybegynder
11. august 2005 - 21:58 #20
hvad mener du
Avatar billede bertelbrander Praktikant
11. august 2005 - 22:00 #21
Jeg mener, hvilken side skal jeg connecte til og hvilken port?
Der må sidde nogen i den anden ende som man kan snakke med.
Avatar billede dj-meisner Nybegynder
11. august 2005 - 22:02 #22
localhost - 80

kan jo altid ændre.
Avatar billede bertelbrander Praktikant
11. august 2005 - 22:04 #23
Avatar billede dj-meisner Nybegynder
11. august 2005 - 22:06 #24
Jeps, men søger det jeg beskrev. Når du er færdig kan du sende mig en email med scriptet til:

info@tower.dk

da jeg ikke vil ha nogle skal bruge det :P - en aftale?

så smid lige svar så kan du lige få point.
Avatar billede bertelbrander Praktikant
11. august 2005 - 22:09 #25
Nej, det er ikke en aftale. Det jeg laver her på eksperten er for alle.

Jeg samler ikke på point.
Avatar billede dj-meisner Nybegynder
11. august 2005 - 22:10 #26
Iorden.
Avatar billede dj-meisner Nybegynder
11. august 2005 - 22:11 #27
Lav det hele i én fil. Og den skal virke i DEV-C++
Avatar billede bertelbrander Praktikant
14. august 2005 - 02:13 #28
Prøv med denne.
Der kommer først en box hvor den spørger efter ipaddresse, du kan ugså skrive en URL, så som www.pop.dk
Du bestemmer port med:
const short SocketPort = 5011;
Der skal nok justeres lidt her og der.

#include <windows.h>
#include <commctrl.h>
#include <string.h>
#include <stdio.h>

const short SocketPort = 5011;

#define RX_THREAD_MESSAGE WM_APP
#define REG_KEY "Software\\HomeMadeApps\\P2P-Chat"

class RegistryClass
{
public:
  RegistryClass(const char *aKey)
  {
      if(RegOpenKey(HKEY_CURRENT_USER, aKey, &KeyHandle) != ERROR_SUCCESS)
      {
        if(RegCreateKeyEx(HKEY_CURRENT_USER, aKey, 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &KeyHandle, 0) != ERROR_SUCCESS)
            KeyHandle = 0;
      }
  }
  ~RegistryClass()
  {
      if(KeyHandle)
        RegCloseKey(KeyHandle);
  }
  int GetInt(const char *aKey, int aDefaultValue = 0)
  {
      if(!KeyHandle)
        return aDefaultValue;

      DWORD Type = REG_DWORD, Size = sizeof(DWORD);
      int Value;
      if(RegQueryValueEx(KeyHandle, aKey, 0, &Type, (BYTE *)&Value, &Size) != ERROR_SUCCESS)
        return aDefaultValue;

      return Value;
  }

  void WriteInt(const char *aKey, int aValue)
  {
      if(!KeyHandle)
        return;
      RegSetValueEx(KeyHandle, aKey, 0, REG_DWORD, (BYTE *)&aValue, sizeof(aValue));
  }

  char *GetString(const char *aKey, char *aBuffer, int aMaxSize)
  {
      if(!KeyHandle)
      {
        *aBuffer = 0;
        return aBuffer;
      }
      DWORD Type = REG_SZ, Size = aMaxSize;
      if(RegQueryValueEx(KeyHandle, aKey, 0, &Type, (BYTE *)aBuffer, &Size) != ERROR_SUCCESS)
        *aBuffer = 0;

      return aBuffer;
  }

  void WriteString(const char *aKey, const char *aBuffer)
  {
      if(!KeyHandle)
        return;
      RegSetValueEx(KeyHandle, aKey, 0, REG_SZ, (BYTE *)aBuffer, strlen(aBuffer));
  }

private:
  HKEY KeyHandle;
};

static LRESULT CALLBACK DialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);

SOCKET Socket;
char IPAddressStr[128];
void CleanUp(HWND aHwnd);
struct in_addr RxAddr;
bool HasRxAddr;
bool RunRxThread = true;
bool RxThreadDone = false;

enum  CtrlIdType
{
  ListCtrlId = 1025,
  EditCtrlId,
  SetupEditId,
  OkButtonCtrlId,
  SendButtonCtrlId = IDOK
};

/* Add a line of text to the list box
** Make sure the line is visible Scroll as requred
** Adjust the horz scrollbar */
void AddListText(HWND aMainWnd, const char *aMsg)
{
  static int MaxWidth;
  int idx;
  HWND List;
  HDC dc;
  HFONT Font, OldFont;
  SIZE TextSize, SizeExtra;
  List = GetDlgItem(aMainWnd, ListCtrlId);
  idx = SendMessage(List, LB_ADDSTRING, 0, (LPARAM )aMsg);
  SendMessage(List, LB_SETCARETINDEX, idx, 0);
  dc = GetDC(List);
  Font = (HFONT )SendMessage(aMainWnd, WM_GETFONT, 0, 0);
  OldFont = (HFONT )SelectObject(dc, Font);
  GetTextExtentPoint32(dc, aMsg, strlen(aMsg), &TextSize);
  GetTextExtentPoint32(dc, "WWW", 3, &SizeExtra);
  TextSize.cx += SizeExtra.cx;
  if(TextSize.cx > MaxWidth)
  {
      MaxWidth = TextSize.cx;
      SendMessage(List, LB_SETHORIZONTALEXTENT, MaxWidth, 0);
  }
  SelectObject(dc, OldFont);
  ReleaseDC(List, dc);
}

/* Grab the text from the edit-box and send it on the socket.
** The text is appended to the list-box
*/
void HandleSend(HWND aHwnd)
{
  char text[128], buffer[130];
  struct sockaddr_in sockaddr;
  GetDlgItemText(aHwnd, EditCtrlId, text, sizeof(text));
  sprintf(buffer, ">%s", text);
  AddListText(aHwnd, buffer);
  SetDlgItemText(aHwnd, EditCtrlId, "");

  memset((char *)&sockaddr, 0, sizeof(sockaddr));
  sockaddr.sin_family = AF_INET;
  if(IPAddressStr[0])
  {
      sockaddr.sin_addr.s_addr = inet_addr(IPAddressStr);
      if(sockaddr.sin_addr.s_addr == INADDR_NONE)
      {
        struct hostent *hostinfo;
        hostinfo = gethostbyname(IPAddressStr);
        if(!hostinfo)
        {

            MessageBox(aHwnd, "Failed to convert IPAddress!", "P2P-Chat", MB_OK);
            return;
        }
        else
        {
            memcpy((void *)&sockaddr.sin_addr,  hostinfo->h_addr_list[0], hostinfo->h_length);
        }
      }
  }
  else if(HasRxAddr)
      sockaddr.sin_addr.s_addr = RxAddr.s_addr;
  else
  {
      MessageBox(aHwnd, "No peer address", "P2P-Chat", MB_OK);
      return;
  }

  sockaddr.sin_port = htons(SocketPort);

  if(sendto(Socket, text, strlen(text) + 1, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) == SOCKET_ERROR)
  {
    char Msg[1024];
    sprintf(Msg, "Error: %d", WSAGetLastError());
    MessageBox(aHwnd, Msg, "P2P-Chat", MB_OK);
  }
}

BOOL CALLBACK SetFontProc(HWND aHWnd, LPARAM lParam)
{
  SendMessage(aHWnd, WM_SETFONT, lParam, 0);
  return TRUE;
}

/* Dialog Function for the SetupDialog */
static LRESULT CALLBACK SetupDialogFunc(HWND aDlg, UINT aMsg, WPARAM wParam, LPARAM lParam)
{
  switch(aMsg)
  {
  case WM_CREATE:
      {
        CreateWindow("STATIC",
                      "Enter a peer IP-Address,\r\nor leave it empty to wait for\r\nan incomming message",
                      WS_CHILD | WS_VISIBLE | SS_LEFT,
                      5, 5, 300, 50,
                      aDlg,
                      (HMENU )-1,
                      0,
                      0);

        CreateWindow("STATIC",
                      "IP-Address",
                      WS_CHILD | WS_VISIBLE | SS_LEFT,
                      5, 60, 300, 15,
                      aDlg,
                      (HMENU )-1,
                      0,
                      0);
        CreateWindowEx(WS_EX_CLIENTEDGE,
                        "Edit",
                        "",
                        WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,
                        5, 80, 250, 22,
                        aDlg,
                        (HMENU )SetupEditId,
                        0,
                        0);
        CreateWindow("BUTTON",
                      "OK",
                      WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
                      5, 115, 50, 25,
                      aDlg,
                      (HMENU )IDOK,
                      0,
                      0);

        RegistryClass Registry(REG_KEY);
        Registry.GetString("IPAddress", IPAddressStr, sizeof(IPAddressStr));
        SetDlgItemText(aDlg, SetupEditId, IPAddressStr);
        EnumChildWindows(aDlg, SetFontProc, (LPARAM )GetStockObject(DEFAULT_GUI_FONT));
      }
      break;
  case WM_COMMAND:
      switch (LOWORD(wParam))
      {
      case IDOK:
      {
        GetDlgItemText(aDlg, SetupEditId, IPAddressStr, sizeof(IPAddressStr));
        RegistryClass Registry(REG_KEY);
        Registry.WriteString("IPAddress", IPAddressStr);
        PostMessage(aDlg, WM_QUIT, 1, 1);
      }
      }
      break;
  }
  return DefWindowProc(aDlg, aMsg, wParam, lParam);
}

/* Show the Setupdialog */
BOOL DoSetupDialog(HINSTANCE aHInst)
{
  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = SetupDialogFunc;
  wc.hInstance = aHInst;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "SetupDialogClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  HWND WindowHandle = CreateWindow("SetupDialogClass",
                                    "Whatever", // Caption text
                                    WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS | DS_CENTER |
                                    WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                                    100, 100, 300, 180,  // Position
                                    0,
                                    0,
                                    aHInst,
                                    0);
  MSG Msg;
  while(GetMessage(&Msg, WindowHandle, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  DestroyWindow(WindowHandle);

  return Msg.wParam;
}

DWORD WINAPI RxThreadProc(LPVOID Param)
{
  bool First = true;
  while(RunRxThread)
  {
      fd_set ReadSet;
      FD_ZERO(&ReadSet);
      FD_SET(Socket, &ReadSet);
      timeval TimeOut;
      TimeOut.tv_sec = 1;
      TimeOut.tv_usec = 0;
      if(select(Socket + 1, &ReadSet, 0, 0, &TimeOut) == 1)
      {
        const int MaxLineLength = 256;
        char *buffer = new char [MaxLineLength];
        sockaddr_in RxSockAddr;
        int FromLen = sizeof(RxSockAddr);
        if(recvfrom(Socket, buffer, MaxLineLength, 0, (sockaddr *)&RxSockAddr, &FromLen) != SOCKET_ERROR)
        {
            PostMessage((HWND )Param, RX_THREAD_MESSAGE, (WPARAM )buffer, 0);
            RxAddr = RxSockAddr.sin_addr;
            HasRxAddr = true;
        }
        else
        {
            delete [] buffer;
            if(First)
            {
              char Buf[256];
              sprintf(Buf, "Error: %d", WSAGetLastError());
              MessageBox((HWND )Param, Buf, "P2P-Chat", MB_OK);
              First = false;
            }
        }
      }
  }
  RxThreadDone = true;
  return 0;
}

int APIENTRY WinMain(HINSTANCE aHInst, HINSTANCE, LPSTR, int)
{
  if(!DoSetupDialog(aHInst))
  {
    return 1;
  }

  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  wc.lpfnWndProc = DialogFunc;
  wc.hInstance = aHInst;
  wc.hbrBackground = (HBRUSH )(COLOR_BTNFACE + 1);
  wc.lpszClassName = "MainDialogClass";
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  if(!RegisterClass(&wc))
      return FALSE;

  HWND WindowHandle = CreateWindow("MainDialogClass",
                                    "Whatever", // Caption text
                                    WS_MINIMIZEBOX | WS_VISIBLE | WS_CLIPSIBLINGS | WS_THICKFRAME |
                                    WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_CAPTION | WS_BORDER | WS_SYSMENU,
                                    100, 100, 140, 160,  // Position
                                    0,
                                    0,
                                    aHInst,
                                    0);
  MSG Msg;
  while(GetMessage(&Msg, 0, 0, 0xFFFF) > 0)
  {
      if(!IsDialogMessage(WindowHandle, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
  }
  return 0;
}

/*
** Create the socket, and start the RX thread.
*/
int SetupSocket(HWND hDlg)
{
  WSADATA wsaData;
  struct sockaddr_in sockaddr;
  if(WSAStartup(MAKEWORD(1, 1), &wsaData))
  {
      MessageBox(hDlg, "Failed to start WSA", "P2P-Chat", MB_OK);
      return 1;
  }

  Socket = socket(AF_INET, SOCK_DGRAM, 0);
  if(Socket == INVALID_SOCKET)
  {
      MessageBox(hDlg, "Failed To Create Socket!", "P2P-Chat", MB_OK);
      return 1;
  }

  memset((char *)&sockaddr, 0, sizeof(sockaddr));
  sockaddr.sin_family = AF_INET;
  sockaddr.sin_port = htons(SocketPort);

  BOOL Flag = TRUE;
  setsockopt(Socket, SOL_SOCKET, SO_REUSEADDR, (char *)&Flag, sizeof(Flag));
  if(bind(Socket, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0)
  {
      MessageBox(0, "Failed to bind socket!", "P2P-Chat", MB_OK);
      return 1;
  }
  DWORD RxThreadID;
  CreateThread(0, 0, RxThreadProc, (LPVOID )hDlg, 0, &RxThreadID);
  return 1;
}

void OnSize(HWND aMainWnd, int aWidth, int aHeight)
{
  HWND hwnd;
  hwnd = GetDlgItem(aMainWnd, SendButtonCtrlId);
  MoveWindow(hwnd, 5, aHeight - 25, 50, 20, TRUE);
  hwnd = GetDlgItem(aMainWnd, OkButtonCtrlId);
  MoveWindow(hwnd, 70, aHeight - 25, 50, 20, TRUE);
  hwnd = GetDlgItem(aMainWnd, EditCtrlId);
  MoveWindow(hwnd, 5, aHeight - 55, aWidth - 10, 25, TRUE);
  hwnd = GetDlgItem(aMainWnd, ListCtrlId);
  MoveWindow(hwnd, 5, 5, aWidth - 10, aHeight - 65, TRUE);
}

/*
** This is the main function for the main dialog. It handles all messages.
*/

static LRESULT CALLBACK DialogFunc(HWND aDlg, UINT aMsg, WPARAM wParam, LPARAM lParam)
{
  switch(aMsg)
  {
  case WM_CREATE:
      {
        CreateWindowEx(WS_EX_CLIENTEDGE,
                        "LISTBOX",
                        "",
                        WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL | LBS_NOINTEGRALHEIGHT,
                        5, 5, 100, 100,
                        aDlg,
                        (HMENU )ListCtrlId,
                        0,
                        0);
        CreateWindowEx(WS_EX_CLIENTEDGE,
                        "Edit",
                        "",
                        WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
                        5, 80, 250, 22,
                        aDlg,
                        (HMENU )EditCtrlId,
                        0,
                        0);
        CreateWindow("BUTTON",
                      "Send",
                      WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_DEFPUSHBUTTON,
                      5, 100, 50, 20,
                      aDlg,
                      (HMENU )SendButtonCtrlId,
                      0,
                      0);
        CreateWindow("BUTTON",
                      "Exit",
                      WS_CHILD | WS_VISIBLE | WS_TABSTOP,
                      5, 100, 50, 20,
                      aDlg,
                      (HMENU )OkButtonCtrlId,
                      0,
                      0);
        SetupSocket(aDlg);
        HWND Edit = GetDlgItem(aDlg, EditCtrlId);
        SetFocus(Edit);
        RegistryClass Registry(REG_KEY);
        RECT R;
        R.left = Registry.GetInt("LeftPos", -1);
        if(R.left != -1)
        {
            R.right = Registry.GetInt("RightPos", R.left + 200);
            R.top = Registry.GetInt("TopPos", 100);
            R.bottom = Registry.GetInt("BottomPos", R.top + 200);
            MoveWindow(aDlg, R.left, R.top, R.right - R.left, R.bottom - R.top, TRUE);
        }
        else
        {
            GetClientRect(aDlg, &R);
            OnSize(aDlg, R.right - R.left, R.bottom - R.top);
        }
        EnumChildWindows(aDlg, SetFontProc, (LPARAM )GetStockObject(DEFAULT_GUI_FONT));
        return FALSE;
      }
  case RX_THREAD_MESSAGE:
      {
        char *text = (char *)wParam;
        AddListText(aDlg, text);
        delete [] text;
      }
      break;
  case WM_GETMINMAXINFO:
      {
        MINMAXINFO *MinMaxInfo = (MINMAXINFO *)lParam;
        MinMaxInfo->ptMinTrackSize.x = 200;
        MinMaxInfo->ptMinTrackSize.y = 200;
      }
      break;
  case WM_COMMAND:
      switch (LOWORD(wParam))
      {
      case OkButtonCtrlId:
        CleanUp(aDlg);
        PostMessage(aDlg, WM_QUIT, 1, 1);
        break;
      case SendButtonCtrlId:
        HandleSend(aDlg);
        return 0;
      }
      break;
  case WM_SIZE:
      OnSize(aDlg, LOWORD(lParam), HIWORD(lParam));
      return 0;
  }
  return DefWindowProc(aDlg, aMsg, wParam, lParam);
}

void CleanUp(HWND aHwnd)
{
  RunRxThread = false;
  RegistryClass Registry(REG_KEY);
  RECT R;
  GetWindowRect(aHwnd, &R);
  Registry.WriteInt("LeftPos", R.left);
  Registry.WriteInt("RightPos", R.right);
  Registry.WriteInt("TopPos", R.top);
  Registry.GetInt("BottomPos", R.bottom);
  while(!RxThreadDone)
      Sleep(100);

  if(Socket)
      closesocket(Socket);
  Socket = 0;
  WSACleanup();
}
Avatar billede dj-meisner Nybegynder
15. august 2005 - 16:09 #29
udskriver ->
C:\DOCUME~1\Ejer\LOKALE~1\Temp\ccstbaaa.o(.text+0xb8) In function `Z11AddListTextP6HWND__PKc':

  [Linker error] undefined reference to `GetTextExtentPoint32A@16'
  [Linker error] undefined reference to `SelectObject@8'
  [Linker error] undefined reference to `GetTextExtentPoint32A@16'
  [Linker error] undefined reference to `SelectObject@8'
Avatar billede bertelbrander Praktikant
15. august 2005 - 19:15 #30
Du skal tilføje -lgdi32 samme sted som -lws2_32, adskilt af mellemrum
Avatar billede dj-meisner Nybegynder
15. august 2005 - 23:05 #31
Jeps, men den udskriver da ikke outputtet?
Det du har lavet er jo en slags chat.

Man skal kunne skrive en port og en host også connecter den og viser outputtet, så kan man svare tilbage til serveren (ved at trykke ENTER) fx. i tekstfeltet skriv:
hej også trykker man ENTER så udskriver den outputtet i det øverste felt.!
Avatar billede bertelbrander Praktikant
15. august 2005 - 23:09 #32
Hvilket output er det den skal skrive?
Hvad er det for en server den skal connecte til?
Hvis det fortsat skal være en hemmelighed er det meget svært at lave programmet.
Avatar billede dj-meisner Nybegynder
15. august 2005 - 23:10 #33
Man skal selv kunne skrive det også connecter den.
127.0.0.1 -  80

Er det så svært at få den til at udskrive outputtet fra serveren da ?
Avatar billede bertelbrander Praktikant
15. august 2005 - 23:12 #34
Vil du have programmet til at hente en hjemmeside eller?
Avatar billede dj-meisner Nybegynder
15. august 2005 - 23:14 #35
Nej nej nej.. Fx. jeg skriver i host: www.google.dk port: 1234

så kommer outputtet fra serveren.. Så kan du fx. skrive "GET" i din kommando-input også trykke ENTER så kommer outputtet, som gerne skulle vise alt deres HTML.
Avatar billede bertelbrander Praktikant
15. august 2005 - 23:18 #36
Undskyld, jeg er vist meget langsom.
Hvad er det for et output der kommer når du konnekter?

(Man kan godt lave et program der viser html, der ligger et på min hjemmeside).

Jeg har stadig ikke regnet ud hvad formålet er.
Avatar billede dj-meisner Nybegynder
15. august 2005 - 23:21 #37
program til at udskrive kommandoer til servere man konnekter til.
Avatar billede bertelbrander Praktikant
15. august 2005 - 23:25 #38
Jeg prøver lige at lave en connect.
Avatar billede bertelbrander Praktikant
16. august 2005 - 00:22 #39
Jeg kan ikke få det til at virke ordentligt.
Jeg kan godt hente en header på google, men forbindelsen bliver lukket.
Jeg er bange for at det er for stort et project.
Hvis jeg finder noget mere tid en af de første dage er det muligt at jeg arbejder lidt videre.
Du er naturligvis velkommen til at arbejde videre med projectet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester