Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* SERVER */
- #include <sys/types.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #define BUF_SIZE 1024
- int main(int argc, char* argv[])
- {
- struct addrinfo hints;
- struct addrinfo *result, *rp;
- int sfd, s;
- struct sockaddr_storage peer_addr;
- socklen_t peer_addr_len;
- ssize_t nread;
- char buf[BUF_SIZE];
- char input[BUF_SIZE];
- int fd;
- int len;
- if (argc != 2) {
- fprintf(stderr, "Usage: %s port\n", argv[0]);
- exit(EXIT_FAILURE);
- }
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
- hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
- hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
- hints.ai_protocol = 0; /* Any protocol */
- hints.ai_canonname = NULL;
- hints.ai_addr = NULL;
- hints.ai_next = NULL;
- s = getaddrinfo(NULL, argv[1], &hints, &result);
- if (s != 0) {
- fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
- exit(EXIT_FAILURE);
- }
- /* getaddrinfo() returns a list of address structures.
- Try each address until we successfully bind(2).
- If socket(2) (or bind(2)) fails, we (close the socket
- and) try the next address. */
- for (rp = result; rp != NULL; rp = rp->ai_next) {
- sfd = socket(rp->ai_family, rp->ai_socktype,
- rp->ai_protocol);
- if (sfd == -1)
- continue;
- if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0)
- break; /* Success */
- close(sfd);
- }
- if (rp == NULL) { /* No address succeeded */
- fprintf(stderr, "Could not bind\n");
- exit(EXIT_FAILURE);
- }
- freeaddrinfo(result); /* No longer needed */
- /* Read datagrams and echo them back to sender */
- peer_addr_len = sizeof(struct sockaddr_storage);
- for (;;) {
- nread = recvfrom(sfd, buf, BUF_SIZE, 0,
- (struct sockaddr*)&peer_addr, &peer_addr_len);
- if (nread == -1)
- continue; /* Ignore failed request */
- if((fd = open(buf,O_RDONLY)) == -1)
- {
- perror("wrong path");
- continue;
- }
- while ((len = read(fd,input,BUF_SIZE-1)) > 0)
- {
- if(write(STDOUT_FILENO,input,len) == -1)
- perror("error");
- if (sendto(sfd, input, len, 0,
- (struct sockaddr*)&peer_addr,
- peer_addr_len)
- != len)
- fprintf(stderr, "Error sending response\n");
- }
- printf("came here\n");
- close(fd);
- }
- }
- /* CLIENT */
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netdb.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #define BUF_SIZE 1024
- int main(int argc, char* argv[])
- {
- struct addrinfo hints;
- struct addrinfo *result, *rp;
- int sfd, s, j;
- size_t len;
- ssize_t nread;
- char buf[BUF_SIZE];
- char input[BUF_SIZE];
- if (argc < 2) {
- fprintf(stderr, "Usage: %s host port...\n", argv[0]);
- exit(EXIT_FAILURE);
- }
- /* Obtain address(es) matching host/port */
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
- hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */
- hints.ai_flags = 0;
- hints.ai_protocol = 0; /* Any protocol */
- s = getaddrinfo(argv[1], argv[2], &hints, &result);
- if (s != 0) {
- fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
- exit(EXIT_FAILURE);
- }
- /* getaddrinfo() returns a list of address structures.
- Try each address until we successfully connect(2).
- If socket(2) (or connect(2)) fails, we (close the socket
- and) try the next address. */
- for (rp = result; rp != NULL; rp = rp->ai_next) {
- sfd = socket(rp->ai_family, rp->ai_socktype,
- rp->ai_protocol);
- if (sfd == -1)
- continue;
- if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
- break; /* Success */
- close(sfd);
- }
- if (rp == NULL) { /* No address succeeded */
- fprintf(stderr, "Could not connect\n");
- exit(EXIT_FAILURE);
- }
- freeaddrinfo(result); /* No longer needed */
- /* Send remaining command-line arguments as separate
- datagrams, and read responses from server */
- int n;
- while(scanf("%s",input) != EOF)
- {
- write(sfd,input,BUF_SIZE-1);
- while((n=read(sfd,input,BUF_SIZE-1)) > 0)
- {
- if(write(STDOUT_FILENO,input,n) == -1)
- perror("error");
- }
- }
- /**
- for (j = 3; j < argc; j++) {
- len = strlen(argv[j]) + 1;
- /* +1 for terminating null byte
- if (len > BUF_SIZE) {
- fprintf(stderr,
- "Ignoring long message in argument %d\n", j);
- continue;
- }
- if (write(sfd, argv[j], len) != len) {
- fprintf(stderr, "partial/failed write\n");
- exit(EXIT_FAILURE);
- }
- nread = read(sfd, buf, BUF_SIZE);
- if (nread == -1) {
- perror("read");
- exit(EXIT_FAILURE);
- }
- printf("Received %zd bytes: %s\n", nread, buf);
- }
- **/
- exit(EXIT_SUCCESS);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement