unix网络编程----迭代式echo服务器与客户端(只支持一个客户端通信)

来源:互联网 发布:mac怎么批量删除照片 编辑:程序博客网 时间:2024/05/17 07:31

    分别用gcc编译两个代码为可执行程序client和server之后,在一个终端里运行./server启动服务器,在另一个终端运行./client 127.0.0.1后,就可以在client终端里面输入任意字符然后回车,输入的字符会发送到服务器,然后被服务器返回来,在client终端里显示,起到"echo"的效果。此代码可以作为网络编程基础设置的参考。

    参考资料:<<UNIX Network Programming Volumn1:The Sockets Networking API>>  W.Richard Stevens,Bill Fenner,Andrew M.Rudoff


客户端代码:

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

#define BUFFSIZE    4096
#define SERV_PORT   9877
#define SA  struct  sockaddr
#define LISTENQ 1024
#define STDIN_FILENO    0
#define STDOUT_FILENO   1

int
main(int argc, char **argv)
{
    struct timeval  tpstart,tpend;
    char    buf[BUFFSIZE];
    double  timeuse;
    int sockfd;
    int tffd;
    char    time[64];
    ssize_t n;
    struct  sockaddr_in servaddr;
    if(argc != 2){
        printf("usage: cmd <IPaddress>/n");
        exit(0);
    }
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
    connect(sockfd, (SA *) &servaddr, sizeof(servaddr));
    gettimeofday(&tpstart,NULL);
    printf("time got!/n");
    while(1)
    {
        if((n = read(STDIN_FILENO,buf,BUFFSIZE)) == 0)
            break;
        n = write(sockfd, buf, n);
        n = read(sockfd, buf, BUFFSIZE);
        n = write(STDOUT_FILENO,buf,n);
    }
    gettimeofday(&tpend,NULL);
    timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
    timeuse/=1000000;
    gcvt(timeuse, 10, time);
    tffd = creat("time.txt", 0644);
    write(tffd, time, 64);
    close(tffd);
    exit(0);
}


服务器代码:

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

#define MAXLINE 4096
#define SERV_PORT   9877
#define SA  struct  sockaddr
#define LISTENQ 1024

int
main(int argc, char **argv)
{
    int listenfd, connfd;
    char    buf[MAXLINE];
    ssize_t n;
    pid_t   childpid;
    socklen_t   clilen;
    struct  sockaddr_in cliaddr, servaddr;
    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(SERV_PORT);
    bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    listen(listenfd, LISTENQ);
    while(1){
        clilen = sizeof(cliaddr);
        connfd = accept(listenfd, (SA *) &cliaddr, &clilen);
        while(1)
     {
            if((n = read(connfd, buf, MAXLINE)) == 0)
             break;
       
            n = write(connfd,buf,n);
     }
        close(connfd);
    }
}

 

原创粉丝点击