lang:c:net:client_serveur
Ceci est une ancienne révision du document !
TCP
<note important>TODO. recv en non bloquant.</note>
SOCKETS - SERVER & CLIENT Archive
Server and client example with C sockets on Linux Archive
Programming UNIX Sockets in C - Frequently Asked Questions Archive FAQ Archive Source
Serveur
- serveur.c
#define _GNU_SOURCE #include <netinet/in.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> // the thread function void *connection_handler(void *socket_desc); int main(int argc, char *argv[]) { int socket_desc, client_sock, c, *new_sock; struct sockaddr_in server, client; // Create socket socket_desc = socket(AF_INET, SOCK_STREAM, 0); if (socket_desc == -1) { printf("Could not create socket"); } puts("Socket created"); // Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(8888); // Bind if (bind(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) { // print the error message perror("bind failed. Error"); return 1; } puts("bind done"); // Listen listen(socket_desc, 3); // Accept and incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); while ((client_sock = accept4(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c, 0))) { puts("Connection accepted"); pthread_t sniffer_thread; new_sock = (int *)malloc(sizeof(int)); *new_sock = client_sock; if (pthread_create(&sniffer_thread, NULL, connection_handler, (void *)new_sock) < 0) { perror("could not create thread"); return 1; } // Now join the thread , so that we dont terminate before the thread // pthread_join( sniffer_thread , NULL); puts("Handler assigned"); } if (client_sock < 0) { perror("accept failed"); return 1; } return 0; } /* * This will handle connection for each client * */ void *connection_handler(void *socket_desc) { // Get the socket descriptor int sock = *(int *)socket_desc; int read_size; char *message, client_message[2000]; // Send some messages to the client message = "Greetings! I am your connection handler\n"; write(sock, message, strlen(message) + 1); message = "Now type something and i shall repeat what you type \n"; write(sock, message, strlen(message) + 1); // Receive a message from client while ((read_size = recv(sock, client_message, 2000, 0)) > 0) { // Send the message back to client write(sock, client_message, strlen(client_message) + 1); } if (read_size == 0) { puts("Client disconnected"); fflush(stdout); } else if (read_size == -1) { perror("recv failed"); } // Free the socket pointer free(socket_desc); return 0; }
Client
- client.c
#include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <unistd.h> int main(int argc, char *argv[]) { int sock; struct sockaddr_in server; char message[1000], server_reply[2000]; // Create socket sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { printf("Could not create socket"); } puts("Socket created"); server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons(8888); // Connect to remote server if (connect(sock, (struct sockaddr *)(&server), sizeof(server)) < 0) { perror("connect failed. Error"); return 1; } puts("Connected\n"); // keep communicating with server while (1) { printf("Enter message : "); scanf("%s", message); // Send some data if (send(sock, message, strlen(message) + 1, 0) < 0) { puts("Send failed"); return 1; } // Receive a reply from the server if (recv(sock, server_reply, 2000, 0) < 0) { puts("recv failed"); break; } puts("Server reply :"); puts(server_reply); } close(sock); return 0; }
UDP
lang/c/net/client_serveur.1547730731.txt.gz · Dernière modification : 2019/01/17 14:12 de root