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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#if 1
#define PORT 4000
#define IP "127.0.0.1"
#else
#define PORT 23
#define IP "192.168.0.1"
#endif
#define NELEM(a) (sizeof(a)/sizeof*(a))
static void psock_perror (char const *cmt)
{
#if defined (WIN32) || defined (_WIN32)
fprintf (stderr, "%s: ", cmt);
{
DWORD err = WSAGetLastError ();
wchar_t msg[1024];
FormatMessageW (FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0,
msg, NELEM (msg), NULL);
fwprintf (stderr, L"%s\n", msg);
}
#elif defined (linux) || defined (_POSIX_VERSION) || defined (_POSIX2_C_VERSION)\
|| defined (_XOPEN_VERSION)
perror (cmt);
#else
#error not defined for this platform
#endif
}
int main (void)
{
WSADATA WSAData;
int erreur = WSAStartup (MAKEWORD (2, 0), &WSAData);
int sock_err;
if (!erreur)
{
/* tentative de mode client */
SOCKET sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock != INVALID_SOCKET)
{
SOCKADDR_IN sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr (IP);
sin.sin_port = htons (PORT);
if (connect (sock, (SOCKADDR *) & sin, sizeof (sin)) != SOCKET_ERROR) /* connexion réussie, on passe en mode client */
{
printf ("Mode serveur\n");
printf ("Connecte a %s sur le port %d\n",
inet_ntoa (sin.sin_addr), htons (sin.sin_port));
}
else /* la connexion a échoué, on passe en mode serveur */
{
printf ("Mode serveur\n");
closesocket (sock);
sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock != INVALID_SOCKET)
{
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl (INADDR_ANY);
sin.sin_port = htons (PORT);
sock_err = bind (sock, (SOCKADDR *) & sin, sizeof (sin));
if (sock_err != SOCKET_ERROR)
{
sock_err = listen (sock, 5);
if (sock_err != SOCKET_ERROR)
{
/* CLIENT */
SOCKADDR_IN csin;
SOCKET csock;
unsigned int crecsize = (unsigned int) sizeof csin;
printf ("En attente d'un client ...\n");
csock =
accept (sock, (SOCKADDR *) & csin, (int *) &crecsize);
printf
("Un client se connecte avec la socket %d de %s:%d\n",
csock, inet_ntoa (csin.sin_addr),
htons (csin.sin_port));
closesocket (csock);
}
else
psock_perror ("listen");
}
else
psock_perror ("bind");
}
else
psock_perror ("socket");
}
closesocket (sock);
}
else
psock_perror ("socket");
WSACleanup ();
}
return EXIT_SUCCESS;
} |
Partager