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?
A kérdés helyesen:
Mi a forrás
A helyes kérdés:
Mi a hiba a forráskódban?
Tehát műküdik a program? Mert jó lenne hibaüzenetet látni.
Az hogy neten nem érik el az lehet attól van, hogy az ip cím változik. Ezt old meg egy dns cím használatával.
Néhány dolgot máshogy oldottam volna meg.
Néhány kérdés:
devcpp-ban fordítottad?
Milyen headerseket használtál?
Ki van forwardingolva a használt port?
LAN hálózatban működik?
Így nehéz megmondani. Hibát nem látok benne, én mondjuk teljesen máshogy oldottam volna meg.
Igen, lefodul a program. Működik is az én gépemen, de más már nem tud csatlakozni neten keresztül.
Én PellesC-t használok.
Headerek:
#include <windows.h>
#include <commctrl.h>
#include <stdio.h>
#include <string.h>
#include <winsock.h>
#include <io.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdarg.h>
Hibaüzenet pedig nincs, de nem lehet csatlakozni. Mármint azt írták vissza.
1.) REgisztrálj egy dns címet a dydns.hu-n.
2. Ha felmész a weboldalra, akkor megkapod az új ip-dre a dns átirányítás címét.( ezt persze lehet automatizálni, van egy wget-et scriptük( tehát le kell menteni a honlapot, ezt meg tudod oldani nagy valószínűséggel, wget nélkül is ha kell adok sima c-s scriptet)
3. A programod kezdje azzal, hogy a kliens kérdezze le a netről te dydns címedhez tartozó ip címet, majd erre építsd a socket-et meg tudod oldani?
Sajnos kissé kínai nekem ez.
Azt nem értem, hogy most mi van ezzel a szerverrel.
Nekem beadja az üzeneteket. Viszont máshogy nem tudom teszelni.
Nah akkor konkrétabban:
A szervered jó bár egy-két dolog személy szerint nem tetszik nekem( máshogy csináltam volna), de ez egyéni szoc problem.
A helyzet az, hogy a programod azért nem működik a neten, mert mindig változik a ip címed. Ahhoz hogy tudd használni ki kellene engedni először is a router-ben( no meg a gépben) a címet. Ezt hívják port forwardingnak. Ugyanis a ip cím változik.
A dns címről:
a neten ha gyakran változik a ip cím akkor gyakran használnak egy szervert, ami megadja, hogy a pl. a google.hu-nak mi az ip címe. Először lekérdezi a böngésző a dns szervert, hogy mi ez, majd utána csinálja a syn-es cuccot( amivel csatlakozik a szerverre)
Ezért ha regisztrálnál magadnak egy ingyenes dns címet, akkor bárki tud csatlakozni a gépedhez.
Hogyan tudod használni?
Van a dydns.hu. Erre ha felmész a regisztrációs adataiddal( felhasználónév & jelszó), akkor a dydns.hu megállípítja a ip címedet, és a te dns azonosítódhoz hozzárendeli az új ip címet. Ezt úgy tudod automatizáltan megtenni, hogy csinálsz egy olyan kódot, ami letölti azt a honlapod, amiben a te azonosítóddal belépsz...
Tehát csinálsz egy letöltő "scriptet" c-ben
A programod alapján nem túl bonyolúlt.
A dns lekérdezésnek meg nézz utána, annyit kell tudni róla, hogy az udp protokollt használja és annak 53-as portját kell figyelned. Egy alprogrammal, amiből kibányászod a te ip címedet. Ezt csak a kliensnél kell megtenned.
Tehát addig megvagyok, hogy lekérdem az IP-m DNS-en keresztül.
struct hostent *h;
h=gethostbyname("flsoftware.dyndns.hu");
Ezt hogy rakom be neki?
Gondolom ez helyére kell:
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
Hogyan kell ezt?
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!