C chat szerver. Mi a probléma?
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?
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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!