Skip to content
Snippets Groups Projects
Commit aecebdc9 authored by Kirill's avatar Kirill
Browse files

exo 10

parent b5727274
Branches
No related merge requests found
......@@ -17,39 +17,74 @@
void cpy (int src, int dst)
{
return;
char buffer[1024];
// Read from the source descriptor
ssize_t bytesRead;
while ((bytesRead = read(src, buffer, sizeof(buffer))) > 0) {
ssize_t bytesWritten = write(dst, buffer, bytesRead);
if (bytesWritten == -1) {
perror("Error writing to destination descriptor");
exit(EXIT_FAILURE);
}
}
}
int main (int argc, char *argv [])
{
/* test arg number */
if(argc!=3){
fprintf(stderr, "usage: %s ip_addr port_number\n", argv[0]);
exit(EXIT_FAILURE);
}
/* convert and check port number */
int port_number = atoi(argv[2]);
if(port_number < 10000 || port_number > 65000){
fprintf(stderr,"port number\n");
exit(EXIT_FAILURE);
}
/* create socket */
int new_socket;
CHECK(new_socket = socket(AF_INET6,SOCK_STREAM,IPPROTO_TCP));
/* SO_REUSEADDR option allows re-starting the program without delay */
int iSetOption = 1;
CHECK (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, &iSetOption,
CHECK (setsockopt (new_socket, SOL_SOCKET, SO_REUSEADDR, &iSetOption,
sizeof iSetOption));
/* complete struct sockaddr */
struct addrinfo hints, *serv_dest;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6; // Use IPv6
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_NUMERICHOST;
int error = getaddrinfo(argv[1], argv[2], &hints, &serv_dest);
if (error != 0) {
fprintf(stderr,"getaddrinfo %s\n",gai_strerror(error)); // Generic error message
exit(1); // Set the exit status to 1
}
/* link socket to local IP and PORT */
CHECK(bind(new_socket,serv_dest->ai_addr,serv_dest->ai_addrlen));
/* set queue limit for incoming connections */
CHECK(listen(new_socket,QUEUE_LENGTH));
/* wait for incoming TCP connection */
struct sockaddr_storage client;
socklen_t size = sizeof(client);
int client_sock=accept(new_socket,(struct sockaddr*)&client, &size);
CHECK(client_sock);
/* open local file */
int local_file;
CHECK(local_file=open("copy.tmp",O_WRONLY|O_CREAT|O_TRUNC));
/* get the transmitted file */
cpy(client_sock,local_file);
/* close sockets */
close(new_socket);
close(client_sock);
/* close file */
close(local_file);
/* free memory */
freeaddrinfo(serv_dest);
return 0;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment