链接服务器和客户端

时间:2014-11-05 20:58:20

标签: ubuntu linker client server

如何在同一台机器上链接这些客户端和服务器程序我通过USB使用linux env我需要打开两个终端窗口吗?第二,我自己提供了端口号,给出了错误"地址已经在使用"我怎样才能避免这个错误,如何在同一台机器上编译它们我的主机名是" ubuntu"亲切地告诉我们

                /*
            ** server.c -- a stream socket server demo
            */

            #include <stdio.h>
            #include <stdlib.h>
            #include <unistd.h>
            #include <errno.h>
            #include <string.h>
            #include <sys/types.h>
            #include <sys/socket.h>
            #include <netinet/in.h>
            #include <netdb.h>
            #include <arpa/inet.h>
            #include <sys/wait.h>
            #include <signal.h>

            #define PORT "3490"      // the port users will be connecting to

            #define BACKLOG 10   // how many pending connections queue will hold

            void sigchld_handler(int s)
            {
                while(waitpid(-1, NULL, WNOHANG) > 0);
            }

            // get sockaddr, IPv4 or IPv6:

            void *get_in_addr(struct sockaddr *sa)
            {
                if (sa->sa_family == AF_INET)
                {
                    return &(((struct sockaddr_in*)sa)->sin_addr);
                }

                    return &(((struct sockaddr_in6*)sa)->sin6_addr);
            }

            int main(void)
            {
                int sockfd, new_fd;                       // listen on sock_fd, new connection on new_fd
                struct addrinfo hints, *servinfo, *p;
                struct sockaddr_storage their_addr;       // connector's address information
                socklen_t sin_size;
                struct sigaction sa;
                int yes=1;
                char s[INET6_ADDRSTRLEN];
                int rv;

                memset(&hints, 0, sizeof hints);
                hints.ai_family = AF_UNSPEC;
                hints.ai_socktype = SOCK_STREAM;
                hints.ai_flags = AI_PASSIVE;              // use my IP

                if ((rv = getaddrinfo(NULL, PORT, &hints, &servinfo)) != 0) 
                {
                    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
                    return 1;
                }

                // loop through all the results and bind to the first we can

                for(p = servinfo; p != NULL; p = p->ai_next)
                {
                    if ((sockfd = socket(p->ai_family, p->ai_socktype,p->ai_protocol)) == -1) 
                    {
                        perror("server: socket");
                        continue;
                    }

                    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes,sizeof(int)) == -1)
                    {
                        perror("setsockopt");
                        exit(1);
                    }

                    if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) 
                    {
                        close(sockfd);
                        perror("server: bind");
                        continue;
                    }

                    break;
                }

                if (p == NULL)
                {
                    fprintf(stderr, "server: failed to bind\n");
                    return 2;
                }

                freeaddrinfo(servinfo); // all done with this structure

                if (listen(sockfd, BACKLOG) == -1) {
                    perror("listen");
                    exit(1);
                }

                sa.sa_handler = sigchld_handler; // reap all dead processes
                sigemptyset(&sa.sa_mask);
                sa.sa_flags = SA_RESTART;
                if (sigaction(SIGCHLD, &sa, NULL) == -1) {
                    perror("sigaction");
                    exit(1);
                }

                printf("server: waiting for connections...\n");

                while(1) 
                    {  
                        // main accept() loop

                        sin_size = sizeof their_addr;
                        new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
                        if (new_fd == -1)
                        {
                        perror("accept");
                        continue;
                        }

                        inet_ntop(their_addr.ss_family,get_in_addr((struct sockaddr *)&their_addr),s, sizeof s);
                        printf("server: got connection from %s\n", s);

                        if (!fork())
                        {
                        // this is the child process

                        close(sockfd); // child doesn't need the listener
                        if (send(new_fd, "Hello, world!", 13, 0) == -1)
                        perror("send");
                        close(new_fd);
                        exit(0);
                        }
                           close(new_fd);  // parent doesn't need this
                }

                return 0;
            }

1 个答案:

答案 0 :(得分:0)

打开两个终端。在一次运行服务器进程。在另一个运行您的客户端使用您的localhost(主要是127.0.0.1)并提供相同的端口号。如果在终端中你已经运行了服务器程序,然后你想在同一个终端中再次运行相同的服务器程序,它就会使用已经使用过的端口地址。只需关闭终端并打开一个新的终端。