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
 1/11 A kérdező kommentje:

A kérdés helyesen:

Mi a forrás

2013. febr. 17. 18:36
 2/11 A kérdező kommentje:

A helyes kérdés:

Mi a hiba a forráskódban?

2013. febr. 17. 18:38
 3/11 anonim ***** válasza:

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.

2013. febr. 17. 19:16
Hasznos számodra ez a válasz?
 4/11 A kérdező kommentje:

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.

2013. febr. 17. 19:21
 5/11 A kérdező kommentje:
Hogy használjak DNS-t?
2013. febr. 17. 19:24
 6/11 anonim ***** válasza:

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?

2013. febr. 17. 19:35
Hasznos számodra ez a válasz?
 7/11 A kérdező kommentje:

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.

2013. febr. 17. 19:38
 8/11 anonim ***** válasza:

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.

2013. febr. 17. 19:51
Hasznos számodra ez a válasz?
 9/11 A kérdező kommentje:
Mi az a pár dolog, amit nem így csináltál volna?
2013. febr. 17. 21:50
 10/11 A kérdező kommentje:

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?

2013. febr. 17. 22:14
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!