Hi Leute,
ich habe ein Problem. Ich möchte in C einen chat programmieren mit sockets, mit dem ich mit mehreren Leuten Chatten kann. Ich habe mir gedacht ich mache das mit broadcasting, aber ich weiß nciht wie ich das realisieren soll, dass ich zu jeder Zeit schreiben und empfangen kann.
Ich habe bereits ein Server -> Clients system. Aber die Clients können nur auf Nachriten vom Server antworten und keine selber schreiben.
Ich bin jetzt auch nciht so erfahren was Socketprogrammierung angeht.
Das ist der Server erstmal ohne receivefunction
C/C++-Quelltext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include < stdio.h> /* for printf(), fprintf() */
#include < windows.h> /* for socket(),... */
#include < stdlib.h> /* for exit() */
#include < string.h>
#pragma comment (lib, "Ws2_32.lib" )
int main()
{
int sock; /* Socket */
struct sockaddr_in broadcastAddr; /* Broadcast address */
char * broadcastIP; /* IP broadcast address */
unsigned short broadcastPort; /* Server port */
char * sendString; /* String to broadcast */
int broadcastPermission; /* Socket opt to set permission to broadcast */
unsigned int sendStringLen; /* Length of string to broadcast */
WSADATA wsaData; /* Structure for WinSock setup communication */
broadcastIP = "255.255.255.255" ; /* broadcast IP address */
broadcastPort = atoi("12345" ); /* broadcast port */
sendString = "TEST" ; /* string to broadcast */
if (WSAStartup(MAKEWORD(2 , 0 ), & wsaData) ! = 0 ) /* Load Winsock 2.0 DLL */
{
printf( "WSAStartup() failed" );
}
/* Create socket for sending/receiving datagrams */
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 )
/* Set socket to allow broadcast */
broadcastPermission = 1 ;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void * ) & broadcastPermission,
sizeof (broadcastPermission)) < 0 )
/* Construct local address structure */
memset(& broadcastAddr, 0 , sizeof (broadcastAddr)); /* Zero out structure */
broadcastAddr.sin_family = AF_INET; /* Internet address family */
broadcastAddr.sin_addr.s_addr = inet_addr(broadcastIP);/* Broadcast IP address */
broadcastAddr.sin_port = htons(broadcastPort); /* Broadcast port */
sendStringLen = strlen(sendString); /* Find length of sendString */
for (;;)
{
// Broadcast sendString in datagram to clients every 3 seconds
if (sendto(sock, sendString, sendStringLen, 0 , (struct sockaddr * )
& broadcastAddr, sizeof (broadcastAddr)) ! = sendStringLen)
printf("Nachricht: %s" ,sendString);
Sleep(3000 ); //Avoids flooding the network
}
/* NEVER REACHED */
}
C/C++-Quelltext
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include < stdio.h> /* for printf(), fprintf() */
#include < windows.h> /* for socket(),... */
#include < stdlib.h> /* for exit() */
#include < string.h>
#pragma comment (lib, "Ws2_32.lib" )
int main()
{
int sock; /* Socket */
struct sockaddr_in broadcastAddr; /* Broadcast address */
char * broadcastIP; /* IP broadcast address */
unsigned short broadcastPort; /* Server port */
char * sendString; /* String to broadcast */
int broadcastPermission; /* Socket opt to set permission to broadcast */
unsigned int sendStringLen; /* Length of string to broadcast */
WSADATA wsaData; /* Structure for WinSock setup communication */
broadcastIP = "255.255.255.255" ; /* broadcast IP address */
broadcastPort = atoi("12345" ); /* broadcast port */
sendString = "TEST" ; /* string to broadcast */
if (WSAStartup(MAKEWORD(2 , 0 ), & wsaData) ! = 0 ) /* Load Winsock 2.0 DLL */
{
printf( "WSAStartup() failed" );
}
/* Create socket for sending/receiving datagrams */
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 )
/* Set socket to allow broadcast */
broadcastPermission = 1 ;
if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (void * ) & broadcastPermission,
sizeof (broadcastPermission)) < 0 )
/* Construct local address structure */
memset(& broadcastAddr, 0 , sizeof (broadcastAddr)); /* Zero out structure */
broadcastAddr.sin_family = AF_INET; /* Internet address family */
broadcastAddr.sin_addr.s_addr = inet_addr(broadcastIP);/* Broadcast IP address */
broadcastAddr.sin_port = htons(broadcastPort); /* Broadcast port */
sendStringLen = strlen(sendString); /* Find length of sendString */
for (;;)
{
// Broadcast sendString in datagram to clients every 3 seconds
if (sendto(sock, sendString, sendStringLen, 0 , (struct sockaddr * )
& broadcastAddr, sizeof (broadcastAddr)) ! = sendStringLen)
printf("Nachricht: %s" ,sendString);
Sleep(3000 ); //Avoids flooding the network
}
/* NEVER REACHED */
}
Ich hoffe ihr habt Tipps für mich wie ich das realisieren soll.
MFG ViRuZz