Kezdőoldal » Számítástechnika » Programozás » C chat szerver. Mi a probléma?

C chat szerver. Mi a probléma?

Figyelt kérdés

Forráskód:

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)

{

AllocConsole();


HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);

int hCrt = _open_osfhandle((long) handle_out, _O_TEXT);

FILE* hf_out = _fdopen(hCrt, "w");

setvbuf(hf_out, NULL, _IONBF, 1);

*stdout = *hf_out;


HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);

hCrt = _open_osfhandle((long) handle_in, _O_TEXT);

FILE* hf_in = _fdopen(hCrt, "r");

setvbuf(hf_in, NULL, _IONBF, 128);

*stdin = *hf_in;



// This stuff initializes winsock

WSAStartup(wVersionRequested, &wsaData);


// >>> Step #1 <<<

// Create a welcome socket

// - AF_INET is Address Family Internet and SOCK_STREAM is streams

welcome_s = socket(AF_INET, SOCK_STREAM, 0);

if (welcome_s < 0)

{

printf("*** ERROR - socket() failed \n");

exit(-1);

}


// >>> Step #2 <<<

// Fill-in server (my) address information and bind the welcome socket

server_addr.sin_family = AF_INET; // Address family to use

server_addr.sin_port = htons(PORT_NUM); // Port number to use

server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // Listen on any IP address

retcode = bind(welcome_s, (struct sockaddr *)&server_addr,

sizeof(server_addr));

if (retcode < 0)

{

printf("*** ERROR - bind() failed \n");

exit(-1);

}


// >>> Step #3 <<<

// Listen on welcome socket for a connection

listen(welcome_s, 1);


// >>> Step #4 <<<

// Accept a connection. The accept() will block and then return with

// connect_s assigned and client_addr filled-in.

printf("Waiting for accept() to complete... \n");

addr_len = sizeof(client_addr);

connect_s = accept(welcome_s, (struct sockaddr *)&client_addr, &addr_len);

if (connect_s < 0)

{

printf("*** ERROR - accept() failed \n");

exit(-1);

}


// Copy the four-byte client IP address into an IP address structure

memcpy(&client_ip_addr, &client_addr.sin_addr.s_addr, 4);


// Print an informational message that accept completed

printf("Accept completed (IP address of client = %s port = %d) \n",

inet_ntoa(client_ip_addr), ntohs(client_addr.sin_port));


// >>> Step #5 <<<

// Send to the client using the connect socket


while(strcmp(out_buf, "END.")!=0)

{

DialogBox(hInst, MAKEINTRESOURCE(1001), NULL, Kiir);

SendText(out_buf);

}

// >>> Step #6 <<<

// Receive from the client using the connect socket

retcode = recv(connect_s, in_buf, sizeof(in_buf), 0);

if (retcode < 0)

{

printf("*** ERROR - recv() failed \n");

exit(-1);

}

printf("Received from client: %s \n", in_buf);


// >>> Step #7 <<<

// Close the welcome and connect sockets


retcode = closesocket(welcome_s);

if (retcode < 0)

{

printf("*** ERROR - closesocket() failed \n");

exit(-1);

}

retcode = closesocket(connect_s);

if (retcode < 0)

{

printf("*** ERROR - closesocket() failed \n");

exit(-1);

}


// Clean-up winsock

WSACleanup();

return 0;

}


BOOL CALLBACK Kiir(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

char msg[500];


switch (message)

{

case WM_COMMAND:

switch (LOWORD (wParam))

{

case IDOK:

GetDlgItemText(hDlg, 2001, out_buf, 500);

EndDialog(hDlg, 0);

break;

}

return TRUE;

}

return FALSE ;

}


void SendText(char* out_buf)

{

retcode = send(connect_s, out_buf, (strlen(out_buf) + 1), 0);

if (retcode < 0)

{

printf("*** ERROR - send() failed \n");

exit(-1);

}

}


Az a baj, hogy neten keresztül nem érik el. Mi a baj?



2013. febr. 17. 18:15
1 2
 11/11 anonim ***** válasza:

Nah akkor kezdjük:)

1.) megoldottad a letöltést szerver oldalon?

Valahogy így kellene:

CURL *curl;

FILE *fp;

CURLcode res;

char *url = " [link]

char outfilename[FILENAME_MAX] = "C:\\bbb.txt";

curl = curl_easy_init();

if (curl) {

fp = fopen(outfilename,"wb");

curl_easy_setopt(curl, CURLOPT_URL, " [link]

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);

res = curl_easy_perform(curl);

/* always cleanup */

curl_easy_cleanup(curl);

fclose(fp);

}


Ez most csak egy példa a letöltésre( ez szerver oldalon szükséges csak).

Mit csináltam volna másképp:

először is ellenőriztem volna az internetkapcsolatot először, hogy létezik-e. Ezután ha nincs akkor feleslegesen ne menjen bele a többi részprogramba, hiszen értelme nincs.( csökkentené a ram igényét)

Akkor nem fogadnám el minden létező ip címről a kapcsolatot. Tudod stack overflow is létezik a világon, és ha elér valaki egy mérethatárt a csatlakozások számában, és közben valaki küld egy üzenetet egy shell-code-al, akkor feltöri valaki a szervert ahol fut. Éppen ezért egy külön változóban figyelném a kapcsolatok számát is, és maximalizálnám az elfogadottakat. Csinálnék egy text fájlt, amiben rögzitem az ip címeket és a csatlakozás időpontját


A másik a végén a char msg- résznél mielőtt a GetDLgItemText-et csinálnál ellenőriznéd a méretét az nem ártana, hogy az tényleg 500 byte-nál kisebb-e( tudod ismét stackoverflow miatt)


A kliens oldalon kellene, betenni azt, hogy erver_addr.sin_addr.d_addr=inet_ntoa(gethostbyname("flsoftware.dyndns.hu"));

Mert ahogy látom ez a server oldali kód. További segítség csak annak ismeretében tudnék adni.

2013. febr. 18. 08:01
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!