-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdsmwrap.c
153 lines (120 loc) · 4.43 KB
/
dsmwrap.c
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
143
144
145
146
147
148
149
150
151
152
153
#include "common_impl.h"
struct hostent* get_server(const char *host_target);
void init_serv_address(struct hostent* server, struct sockaddr_in* serv_addr_ptr, int port_no);
int main(int argc, char **argv)
{
/*
if (argc < 3)
{
usage();
}*/
/* processus intermediaire pour "nettoyer" */
/* la liste des arguments qu'on va passer */
/* a la commande a executer vraiment */
/* creation d'une socket pour se connecter au */
/* au lanceur et envoyer/recevoir les infos */
/* necessaires pour la phase dsm_init */
/*
struct hostent {
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;
}
#define h_addr h_addr_list[0]
};
struct hostent *addr_srv;
struct in_addr addr;
addr_srv = gethostbyname(argv[1]);// recuperer dans une structure hostent l'addresse ip du lanceur a partir de son nom
addr.s_addr = *(u_long *) addr_srv->h_addr_list[0]; //recuperer dans une structure in_addr qui correspond au nom de la machine distante
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo)); // initialisation structure addrinfo
hints.ai_socktype = SOCK_STREAM; // type : socket TCP
struct addrinfo* infos_returned;
*/
/* Envoi du nom de machine au lanceur */
/* Envoi du pid au lanceur */
//pid_t pid = getpid();
//printf("%d\n", pid);
/* Creation de la socket d'ecoute pour les */
/* connexions avec les autres processus dsm */
//sock_dsm=creer_socket();
//if(listen(sock_dsm, BACKLOG) < 0) {
//perror("listen");
//exit(EXIT_FAILURE);
//}
/* Envoi du numero de port au lanceur */
/* pour qu'il le propage à tous les autres */
/* processus dsm */
/* on execute la bonne commande */
//return 0;
// for server
int serv_sockfd;
int port_no;
struct sockaddr_in serv_addr;
struct hostent *server;
//Verifying arguments
if (argc < 3) {
fprintf(stderr,"Program %s needs arguments regarding target server: hostname, port\n", argv[0]);
exit(EXIT_FAILURE);
}
port_no = atoi(argv[2]);
/* SERVER - CLIENT */
//Preparing
serv_sockfd = create_socket();
server = get_server(argv[1]);
init_serv_address(server, &serv_addr, port_no);
//Connect to server
if ( connect(serv_sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0 ) {
ERROR_EXIT("Error - connection");
}
char buffer[BUFFER_SIZE] = {'\0'}; //everything sent through buffer!!!! ATTENTION, always memset buffer then copy all in buffer then send
char hostname[20] = "Hello world";
//Simple test for endianness when remote machines at school
//Sending length
//char buffer_number[4] = {0};
int len = strlen(hostname); printf("len is %d\n", len);
memcpy(buffer, &len, sizeof(int)); //suppose endianness ok
write(serv_sockfd, buffer, BUFFER_SIZE);
//Sending hostname
memset(buffer, '\0', BUFFER_SIZE);
strncpy(buffer, hostname, len);
write(serv_sockfd, buffer, BUFFER_SIZE);
//Sending port socket interconnection dsm
memset(buffer, '\0', BUFFER_SIZE);
int pid = 10;
memcpy(buffer, &pid, sizeof(int)); //suppose endianness ok
write(serv_sockfd, buffer, BUFFER_SIZE);
//Sending port socket interconnection dsm
memset(buffer, '\0', BUFFER_SIZE);
int myport = 5368;
memcpy(buffer, &myport, sizeof(int)); //suppose endianness ok
write(serv_sockfd, buffer, BUFFER_SIZE);
//Receive num_procs
memset(buffer, '\0', BUFFER_SIZE);
recv(serv_sockfd, buffer, BUFFER_SIZE, 0);
printf("Hello num_procs %d\n", * (int *) buffer);
//Receive rank
memset(buffer, '\0', BUFFER_SIZE);
recv(serv_sockfd, buffer, BUFFER_SIZE, 0);
printf("Hello rank %d\n", * (int *) buffer);
//Receive all ports interconnected for dsm
memset(buffer, '\0', BUFFER_SIZE);
recv(serv_sockfd, buffer, BUFFER_SIZE, 0);
printf("Hello ports %d\n", * (int *) buffer);
}
struct hostent* get_server(const char *host_target) {
struct hostent *server = gethostbyname(host_target); //Later on: use addrinfo (cf. gethostbyname considered deprecated, and for ipv6...etc)
if (server == NULL) {
fprintf(stderr, "Error: No such host\n");
exit(EXIT_FAILURE);
}
return server;
}
void init_serv_address(struct hostent* server, struct sockaddr_in* serv_addr_ptr, int port_no) {
memset(serv_addr_ptr, 0, sizeof(struct sockaddr_in));
serv_addr_ptr->sin_family = AF_INET;
memcpy(server->h_addr, &(serv_addr_ptr->sin_addr.s_addr), server->h_length);
serv_addr_ptr->sin_port = htons(port_no); //convert to network order
}