c语言中socket编程实现客户机-服务器进程执行

c语言中socket编程实现客户机-服务器进程执行,c,sockets,client-server,C,Sockets,Client Server,客户端代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> void error(const cha

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 

    void error(const char *msg)
    {
            perror(msg);
            exit(0);
    }


    int main(int argc, char *argv[])
    {
        int sockfd, portno, n,choice;
        struct sockaddr_in serv_addr;
        struct hostent *server;

                int buffer;

        if (argc < 3) 
        {
                fprintf(stderr,"usage %s hostname port\n", argv[0]);
                exit(0);
            }

        portno = atoi(argv[2]);
        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        if (sockfd < 0) 
                error("ERROR opening socket");
                server = gethostbyname(argv[1]);

        if (server == NULL) 
        {
                fprintf(stderr,"ERROR, no such host\n");
                exit(0);
            }

            serv_addr.sin_family = AF_INET;
            bcopy((char *)server->h_addr, 
            (char *)&serv_addr.sin_addr.s_addr,server->h_length);
            serv_addr.sin_port = htons(portno);

        if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
                error("ERROR connecting");

        //printf("Please enter positive integer ");

        printf("Enter your choice\n1=Prime number\n2=Fibonacci number\n 3=power of 2\n");
        scanf("%d",&choice);

        if(choice==1){
        printf("Please enter positive integer ");
        scanf("%d", &buffer);
        }

            n = write(sockfd,&buffer,sizeof(buffer));

        if (n < 0) 
            error("ERROR writing to socket");
        char msg[256];
        bzero(msg, 256);

        n=read(sockfd, msg, 255);

        printf("%d %s\n",buffer, msg);

        close(sockfd);
            return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

    void error(const char *msg)
    {
            perror(msg);
            exit(1);
    }

    int prime(int num)
    {
        int c;

        for ( c = 2 ; c <= num - 1 ; c++ )
        {
                if ( num%c == 0 )
                {
                    return 0;
                }
        }

        if ( c == num )
            return 1;

        return 0; 

    }


    int main(int argc, char *argv[])
    {
        int sockfd, newsockfd, portno;
            socklen_t clilen;
            int buffer;
            struct sockaddr_in serv_addr, cli_addr;
            int n;
        int i=1;

        if (argc < 2) 
        {
                fprintf(stderr,"ERROR, no port provided\n");
                exit(1);
            }

        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        if (sockfd < 0) 
                error("ERROR opening socket");

            portno = atoi(argv[1]);
            serv_addr.sin_family = AF_INET;
            serv_addr.sin_addr.s_addr = INADDR_ANY;
            serv_addr.sin_port = htons(portno);

        if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
                    error("ERROR on binding");

        listen(sockfd,5);
            clilen = sizeof(cli_addr);
            newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);

            if (newsockfd < 0) 
                error("ERROR on accept");



            n = read(newsockfd,&buffer,sizeof(buffer));

        int result= prime(buffer);

        if (n < 0) error("ERROR reading from socket");


            printf("Client's input is: %d\n",buffer);

        if(result==1)
        {

            n = write(newsockfd,"is Prime Number",18);
                if (n < 0) error("ERROR writing to socket");
        }

        else 
        {
            n = write(newsockfd,"is not Prime Number",18);
                if (n < 0) error("ERROR writing to socket");
        }





            close(newsockfd);
            close(sockfd);
            return 0; 
    }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效错误(常量字符*消息)
{
佩罗尔(味精);
出口(0);
}
int main(int argc,char*argv[])
{
int sockfd,端口号,n,选项;
服务地址中的结构sockaddr\u;
结构主机*服务器;
int缓冲区;
如果(argc<3)
{
fprintf(stderr,“使用%s主机名端口,\n”,argv[0]);
出口(0);
}
portno=atoi(argv[2]);
sockfd=套接字(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
错误(“打开套接字时出错”);
server=gethostbyname(argv[1]);
如果(服务器==NULL)
{
fprintf(stderr,“错误,没有这样的主机\n”);
出口(0);
}
serv_addr.sin_family=AF_INET;
b复制((字符*)服务器->h_地址,
(char*)&服务器地址sin\u addr.s\u addr,服务器->h\u长度);
serv_addr.sin_port=htons(端口号);
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0)
错误(“连接错误”);
//printf(“请输入正整数”);
printf(“输入您的选择\n1=素数\n2=斐波那契数\n3=2的幂\n”);
scanf(“%d”,选择(&C);
如果(选项==1){
printf(“请输入正整数”);
scanf(“%d”和缓冲区);
}
n=写入(sockfd,&buffer,sizeof(buffer));
if(n<0)
错误(“写入套接字时出错”);
char-msg[256];
bzero(msg,256);
n=读取(sockfd,msg,255);
printf(“%d%s\n”,缓冲区,消息);
关闭(sockfd);
返回0;
}
服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> 

    void error(const char *msg)
    {
            perror(msg);
            exit(0);
    }


    int main(int argc, char *argv[])
    {
        int sockfd, portno, n,choice;
        struct sockaddr_in serv_addr;
        struct hostent *server;

                int buffer;

        if (argc < 3) 
        {
                fprintf(stderr,"usage %s hostname port\n", argv[0]);
                exit(0);
            }

        portno = atoi(argv[2]);
        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        if (sockfd < 0) 
                error("ERROR opening socket");
                server = gethostbyname(argv[1]);

        if (server == NULL) 
        {
                fprintf(stderr,"ERROR, no such host\n");
                exit(0);
            }

            serv_addr.sin_family = AF_INET;
            bcopy((char *)server->h_addr, 
            (char *)&serv_addr.sin_addr.s_addr,server->h_length);
            serv_addr.sin_port = htons(portno);

        if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
                error("ERROR connecting");

        //printf("Please enter positive integer ");

        printf("Enter your choice\n1=Prime number\n2=Fibonacci number\n 3=power of 2\n");
        scanf("%d",&choice);

        if(choice==1){
        printf("Please enter positive integer ");
        scanf("%d", &buffer);
        }

            n = write(sockfd,&buffer,sizeof(buffer));

        if (n < 0) 
            error("ERROR writing to socket");
        char msg[256];
        bzero(msg, 256);

        n=read(sockfd, msg, 255);

        printf("%d %s\n",buffer, msg);

        close(sockfd);
            return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

    void error(const char *msg)
    {
            perror(msg);
            exit(1);
    }

    int prime(int num)
    {
        int c;

        for ( c = 2 ; c <= num - 1 ; c++ )
        {
                if ( num%c == 0 )
                {
                    return 0;
                }
        }

        if ( c == num )
            return 1;

        return 0; 

    }


    int main(int argc, char *argv[])
    {
        int sockfd, newsockfd, portno;
            socklen_t clilen;
            int buffer;
            struct sockaddr_in serv_addr, cli_addr;
            int n;
        int i=1;

        if (argc < 2) 
        {
                fprintf(stderr,"ERROR, no port provided\n");
                exit(1);
            }

        sockfd = socket(AF_INET, SOCK_STREAM, 0);

        if (sockfd < 0) 
                error("ERROR opening socket");

            portno = atoi(argv[1]);
            serv_addr.sin_family = AF_INET;
            serv_addr.sin_addr.s_addr = INADDR_ANY;
            serv_addr.sin_port = htons(portno);

        if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
                    error("ERROR on binding");

        listen(sockfd,5);
            clilen = sizeof(cli_addr);
            newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);

            if (newsockfd < 0) 
                error("ERROR on accept");



            n = read(newsockfd,&buffer,sizeof(buffer));

        int result= prime(buffer);

        if (n < 0) error("ERROR reading from socket");


            printf("Client's input is: %d\n",buffer);

        if(result==1)
        {

            n = write(newsockfd,"is Prime Number",18);
                if (n < 0) error("ERROR writing to socket");
        }

        else 
        {
            n = write(newsockfd,"is not Prime Number",18);
                if (n < 0) error("ERROR writing to socket");
        }





            close(newsockfd);
            close(sockfd);
            return 0; 
    }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
无效错误(常量字符*消息)
{
佩罗尔(味精);
出口(1);
}
整数素数(整数)
{
INTC;

对于(c=2;c您显然需要循环并分叉。

围绕
接受
/
/
/
关闭
的无限循环将保持服务器运行


至于同时接受多个连接,您可以选择在
accept
之后创建一个新进程或线程。另一个选择是使套接字不阻塞(Google是您的朋友!),并使用轮询功能,如
select
poll

查看我的此任务实现:

最基本的技巧是,您需要将accept()关闭到一个无限循环中,然后使用fork()或在接受连接后创建一个新线程

如果您不想使用my helper函数,您将在此处看到一些非常好的教程: 在服务器端

   while (1){

        listen(sockfd,5);
            clilen = sizeof(cli_addr);
            newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen);

            if (newsockfd < 0) 
                error("ERROR on accept");



            n = read(newsockfd,&buffer,sizeof(buffer));

        int result= prime(buffer);

        if (n < 0) error("ERROR reading from socket");


            printf("Client's input is: %d\n",buffer);

        if(result==1)
        {

            n = write(newsockfd,"is Prime Number",18);
                if (n < 0) error("ERROR writing to socket");
        }

        else 
        {
            n = write(newsockfd,"is not Prime Number",18);
                if (n < 0) error("ERROR writing to socket");
        }


    }
while(1){
听(sockfd,5);
clilen=sizeof(cli_addr);
newsockfd=accept(sockfd,(struct sockaddr*)&cli\u addr,&clilen);
if(newsockfd<0)
错误(“接受错误”);
n=读取(newsockfd,&buffer,sizeof(buffer));
int result=prime(缓冲区);
如果(n<0)错误(“从套接字读取错误”);
printf(“客户端的输入为:%d\n”,缓冲区);
如果(结果==1)
{
n=写入(newsockfd,“是素数”,18);
if(n<0)错误(“写入套接字错误”);
}
其他的
{
n=写入(newsockfd,“不是素数”,18);
if(n<0)错误(“写入套接字错误”);
}
}
在客户端:

    //printf("Please enter positive integer ");
    while (choice != -1){
        printf("Enter your choice\n1=Prime number\n2=Fibonacci number\n 3=power of 2\n");
        fflush(stdin);
        scanf("%d",&choice);

        if(choice==1){
        printf("Please enter positive integer ");
        scanf("%d", &buffer);
        }

        n = write(sockfd,&buffer,sizeof(buffer));

        if (n < 0) 
            error("ERROR writing to socket");
        char msg[256];
        bzero(msg, 256);

        n=read(sockfd, msg, 255);

        printf("%d %s\n",buffer, msg);
    }// end of while (choice != -1){
//printf(“请输入正整数”);
while(选项!=-1){
printf(“输入您的选择\n1=素数\n2=斐波那契数\n3=2的幂\n”);
fflush(stdin);
scanf(“%d”,选择(&C);
如果(选项==1){
printf(“请输入正整数”);
scanf(“%d”和缓冲区);
}
n=写入(sockfd,&buffer,sizeof(buffer));
if(n<0)
错误(“写入套接字时出错”);
char-msg[256];
bzero(msg,256);
n=读取(sockfd,msg,255);
printf(“%d%s\n”,缓冲区,消息);
}//时间结束(选项!=-1){
在服务器端,您需要创建一个进程,也许您可以实现一个进程同步系统。关键部分,锁定资源等