socket服务器代码

来源:互联网 发布:centos 中英输入法转换 编辑:程序博客网 时间:2024/06/06 10:40
  1. 创建一个socket使用socket() 系统调用.

  2. 使用bind()系统调用套接字绑定到一个地址。对于互联网上的服务器套接字,地址包括主机的端口号。 

  3. 使用listen()系统调用连接监听

  4. accept() 系统调用形式接受连接。此调用通常会阻塞,直到有客户端与服务器连接。

  5. 发送和接收数据,使用read() 和 write() 系统调用。

现在要把上面这些步骤的形式写成源代码。把这个代码写server.c文件并用gcc编译器编译

#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>int main( int argc, char *argv[] ){    int sockfd, newsockfd, portno, clilen;    char buffer[256];    struct sockaddr_in serv_addr, cli_addr;    int  n;    /* First call to socket() function */    sockfd = socket(AF_INET, SOCK_STREAM, 0);    if (sockfd < 0)     {        perror("ERROR opening socket");        exit(1);    }    /* Initialize socket structure */    bzero((char *) &serv_addr, sizeof(serv_addr));    portno = 5001;    serv_addr.sin_family = AF_INET;    serv_addr.sin_addr.s_addr = INADDR_ANY;    serv_addr.sin_port = htons(portno);     /* Now bind the host address using bind() call.*/    if (bind(sockfd, (struct sockaddr *) &serv_addr,                          sizeof(serv_addr)) < 0)    {         perror("ERROR on binding");         exit(1);    }    /* Now start listening for the clients, here process will    * go in sleep mode and will wait for the incoming connection    */    listen(sockfd,5);    clilen = sizeof(cli_addr);    /* Accept actual connection from the client */    newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr,                                 &clilen);    if (newsockfd < 0)     {        perror("ERROR on accept");        exit(1);    }    /* If connection is established then start communicating */    bzero(buffer,256);    n = read( newsockfd,buffer,255 );    if (n < 0)    {        perror("ERROR reading from socket");        exit(1);    }    printf("Here is the message: %s\n",buffer);    /* Write a response to the client */    n = write(newsockfd,"I got your message",18);    if (n < 0)    {        perror("ERROR writing to socket");        exit(1);    }    return 0; }

处理多个连接:

为了使服务器能够同时处理多个连接,我们在上面的代码进行以下更改:

  1. 将accept语句和下面的代码在一个无限循环。

  2. 建立连接后,调用fork()创建一个新的进程。

  3. 子进程将关闭sockfd中致电doprocessing函数,通过新的套接字文件描述符作为参数。当两个进程已经完成了他们对话中表示由doprocessing()返回,这个过程简单地退出。

  4. 父进程关闭newsockfd。因为所有这些代码是在一个无限循环,它接受语句将返回到等待下一个连接。

#include <stdio.h>#include <sys/types.h> #include <sys/socket.h>#include <netinet/in.h>int main( int argc, char *argv[] ){    int sockfd, newsockfd, portno, clilen;    char buffer[256];    struct sockaddr_in serv_addr, cli_addr;    int  n;    /* First call to socket() function */    sockfd = socket(AF_INET, SOCK_STREAM, 0);    if (sockfd < 0)     {        perror("ERROR opening socket");        exit(1);    }    /* Initialize socket structure */    bzero((char *) &serv_addr, sizeof(serv_addr));    portno = 5001;    serv_addr.sin_family = AF_INET;    serv_addr.sin_addr.s_addr = INADDR_ANY;    serv_addr.sin_port = htons(portno);     /* Now bind the host address using bind() call.*/    if (bind(sockfd, (struct sockaddr *) &serv_addr,                          sizeof(serv_addr)) < 0)    {         perror("ERROR on binding");         exit(1);    }    /* Now start listening for the clients, here      * process will go in sleep mode and will wait      * for the incoming connection     */    listen(sockfd,5);    clilen = sizeof(cli_addr);    while (1)     {        newsockfd = accept(sockfd,                 (struct sockaddr *) &cli_addr, &clilen);        if (newsockfd < 0)        {            perror("ERROR on accept");            exit(1);        }        /* Create child process */        pid = fork();        if (pid < 0)        {            perror("ERROR on fork");    exit(1);        }        if (pid == 0)          {            /* This is the client process */            close(sockfd);            doprocessing(newsockfd);            exit(0);        }        else        {            close(newsockfd);        }    } /* end of while */}

Here is the simple implementation of doprocessing function.

void doprocessing (int sock){    int n;    char buffer[256];    bzero(buffer,256);    n = read(sock,buffer,255);    if (n < 0)    {        perror("ERROR reading from socket");        exit(1);    }    printf("Here is the message: %s\n",buffer);    n = write(sock,"I got your message",18);    if (n < 0)     {        perror("ERROR writing to socket");        exit(1);    }}
0 0
原创粉丝点击