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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv){
char buffer[512]; // The buffer
int mySocket = -1;
int otherSocket = -1;
// need by select
int nb;
fd_set read_set;
// Use by the Server
struct sockaddr_in servAddr, clientAddr; // The struct for adresses
char *message; // The text
int servAddr_length = -1;
// Use by the client
char *serverName = argv[1];
struct sockaddr_in serverSockAddr;
struct hostent *serverHostEnt;
// resolv the adress
struct hostent *resolv;
struct in_addr *addr;
// server
if(argc == 1){
servAddr.sin_port = htons(30000);
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
// socket creation
if((mySocket = socket(AF_INET,SOCK_STREAM,0))== -1){
printf("error during socket's creation\n");
exit(0);
}
// server-socket binding
bind(mySocket,(struct sockaddr *)&servAddr,sizeof(servAddr));
// socket listening
listen(mySocket,5);
// connection accepting
servAddr_length = sizeof(clientAddr);
otherSocket = accept(mySocket,(struct sockaddr *)&clientAddr,&servAddr_length);
if (otherSocket < 0){
printf("acception error\n");
}
else{
printf("connection OK\n");
}
}
// Client
else if( argc == 2){
resolv = gethostbyname(serverName);
if (resolv==NULL) {
printf("Address not found for %s\n", argv[1]);
exit(-1);
}
else {
addr = (struct in_addr*) resolv->h_addr_list[0];
printf("The IP address of %s is %s\n", argv[1], inet_ntoa(*addr));
}
if(((long)inet_ntoa(*addr)) != (long)-1)
bcopy(resolv->h_addr,&serverSockAddr.sin_addr,resolv->h_length);
serverSockAddr.sin_port = htons(30000);
serverSockAddr.sin_family = AF_INET;
/* socket's creation */
if((mySocket = socket(AF_INET,SOCK_STREAM,0)) < 0){
printf("error during client socket's creation\n");
exit(0);
}
/* demand of connection to the server */
if(connect(mySocket,(struct sockaddr *)&serverSockAddr,sizeof(serverSockAddr)) < 0 ){
printf("connection's error\n");
exit(0);
}
printf("client OK\n");
}
else{
printf("error");
exit(-1);
}
// The communication
while(1){
// Clean the buffer
bzero(buffer, sizeof(buffer));
FD_ZERO(&read_set);
FD_SET(0, &read_set);
FD_SET(mySocket, &read_set);
nb = select(mySocket+1, &read_set, NULL, NULL, NULL);
if(nb <= 0){
printf("Error with the select\n");
exit(-1);
}
if(FD_ISSET(mySocket, &read_set)){
nb = read(mySocket, buffer, sizeof(buffer));
if(nb == 0){printf("EOF\n");}
printf("%s\n", buffer);
}
if(FD_ISSET(0, &read_set)){
nb = write(0, buffer, sizeof(buffer));
}
printf("buffer : ");
printf("%s\n", buffer);
}
shutdown(mySocket,2);
close(mySocket);
close(otherSocket);
return 0;
} |
Partager