Linux C http Server 亲测有效【转】

转自:http://my.oschina.net/sharelinux/blog/120223

有时间研究下,学习socket编程。

// server
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include"time.h"


#define  SERVER_PORT 10000
#define  MAX_BUF_SIZE  16
#define  SUCCESS 0
#define  FAILURE -1

int RecvFromServer(int iClientSockFd);

int main(int argc, char **argv)
{
    int iServerSockFd;
    int iClientSockFd;
    struct sockaddr_in stServerAddr;
    struct sockaddr_in stClientAddr;
    int iServerLen;
    int iClientLen;
    int iOpt =1;
    int iReturn;
    pid_t  pid;
    
    // time 
    time_t timer;
    struct tm  *tblock;
    timer = time(NULL);
    tblock= localtime(&timer);
    printf("servertime is %s",asctime(tblock));

    printf("This is the Server.
");
    printf("I am waiting the client to rsync time 
");

    // create server socket
    iServerSockFd = socket(AF_INET, SOCK_STREAM, 0);
    if (iServerSockFd < 0)
    {
        printf("socket create failed in CommManageServerRecvThread.
");
    return FAILURE;
    }
    stServerAddr.sin_family = AF_INET;
    stServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    stServerAddr.sin_port = htons(SERVER_PORT);
    iServerLen = sizeof(stServerAddr);

    // bind socket
    iReturn = bind(iServerSockFd, (struct sockaddr *)&stServerAddr, iServerLen);
    if (iReturn < 0)
    {
    printf("socket bind failed in CommManageServerRecvThread.
");

    }

    setsockopt(iServerSockFd,SOL_SOCKET,SO_REUSEADDR,&iOpt,sizeof(iOpt));

    // listen socket
    iReturn = listen(iServerSockFd, 10);

    // accept request from client
    while(1)
    {
    iClientSockFd = accept(iServerSockFd, (struct sockaddr*)&stClientAddr, (unsigned *)&iClientLen);
    if (iServerSockFd < 0)
    {
        printf("accept failed.
");
        
    }
    pid = fork();    
    switch(pid)
    {
        case -1:
        {
            printf("fork failed.
");
            break;
        }
        case 0:
        {
           write(iClientSockFd,asctime(tblock),30);
           printf("child service ok!!
");
           close(iClientSockFd);
           break;
        }
        default:
        {
            close(iClientSockFd);
            break;
        }
    }

    }

    close(iClientSockFd);

    close(iServerSockFd);

    return SUCCESS;
}

int RecvFromServer(int iClientSockFd)
{
    char acBuf[MAX_BUF_SIZE];
    int iReadNum;

    memset(acBuf, 0, sizeof(acBuf));

    iReadNum = recv(iClientSockFd, acBuf, 0xFFFF, 0);
    if(iReadNum < 0)
    {
        printf("read failed.
");
        return FAILURE;
    }

    printf("Receive form client:
");
    printf("%s
", acBuf);

    return SUCCESS;
}





// client
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>


#define  SERVER_PORT 10000
#define  SERVER_IP   "192.168.0.112"
#define  WRITE_BUF_SIZE  1024

#define  SUCCESS 0
#define  FAILURE -1
char acBuf[WRITE_BUF_SIZE];

int my_read(int fd,void *buffer,int length) 
{        
         int bytes_left;
         int bytes_read;
         char *ptr;     
         bytes_left=length; 
         
         ptr=buffer;
             
         while(bytes_left>0)         
         {          
            bytes_read=read(fd,ptr,bytes_left);
            if(bytes_read<0) 
                 {        
                  if(errno==EINTR) 
                      bytes_read=0;
                  else                 
                      return -1;
                  }              
            else 
               if(bytes_read==0)     
                     break;
              bytes_left -= bytes_read; 
              ptr+=bytes_read;    
          }     
          return(length-bytes_left);
}

int main(int argc, char **argv)
{
    int iSockFd;
    int iReadNum;
    
    struct sockaddr_in stServerAddr;
    struct sockaddr_in stClientAddr;
    int iServerLen;
    int iClientLen;
    int iReturn;
    

    printf("This is the client.
");


    // create server socket
    iSockFd = socket(AF_INET, SOCK_STREAM, 0);
    if (iSockFd < 0)
    {
        printf("socket create failed in CommManageServerRecvThread.
");
        return FAILURE;
    }
    stServerAddr.sin_family = AF_INET;
    inet_pton(AF_INET, SERVER_IP, &stServerAddr.sin_addr);
    stServerAddr.sin_port = htons(SERVER_PORT);

    iServerLen = sizeof(stServerAddr);

    while(1)
    {    
        //printf("try to connect to the server... ...
");
        iReturn = connect(iSockFd, (const struct sockaddr *)&stServerAddr, iServerLen);
        if(iReturn >= 0)
        {
            break;
        }

        sleep(3);
    }

    printf("connect SUCCESS.
");
    
    memset(acBuf, 0, sizeof(acBuf));
    
    my_read(iSockFd, acBuf, 30);
     
    printf("%s
",acBuf);

    close(iSockFd);

    return SUCCESS;
}
原文地址:https://www.cnblogs.com/zhidian314/p/3479655.html