UNIX网络编程(10)--TCP 回射服务器程序和客户程序

原创 2012年03月25日 18:19:36

一个简单的回射服务器的步骤
1.客户端从标准输入读入一行文本,并写给服务器。
2.服务器端从网络输入读入这行文本,并返回给客户
3.客户端从网络输入读入这行反射文本,并显示在标准输出上。

如图:

服务器程序:

#include	"unp.h"

int
main(int argc, char ** argv)
{
    int         listenfd,connfd;
    struct      sockaddr_in cliaddr,servaddr;
    pid_t       childpid;
    socklen_t   clilen;

    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);//#define	SERV_PORT		 9877
    Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
    Listen(listenfd, LISTENQ);
    for( ; ; )
    {
        clilen = sizeof(cliaddr);
        connfd = Accept(listenfd, (SA *)&cliaddr, &clilen);
        if((childpid = Fork()) == 0)
        {
            Close(listenfd);
            str_echo(connfd);
            exit(0);
        }
        Close(connfd);
    }
}

str_echo.c

#include	"unp.h"

void
str_echo(int sockfd)
{
    ssize_t n;
    char    buf[MAXLINE];//#define	MAXLINE		4096

again:
    while( (n = read(sockfd,buf,MAXLINE)) > 0)
        Writen(sockfd,buf,n);
    if(n<0 && errno == EINTR)
        goto again;
    else if (n<0)
        err_sys("str_echo:read error");
}


客户端程序:

#include "unp.h"
#define DEST_IP "127.0.0.1"

int
main(int argc, char ** argv)
{
    int         sockfd;

    struct      sockaddr_in servaddr;

    sockfd = Socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(struct sockaddr_in));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);

    Inet_pton(AF_INET, DEST_IP, &servaddr.sin_addr);
    Connect(sockfd, (SA *)&servaddr, sizeof(servaddr));

    str_cli(stdin,sockfd);
    Close(sockfd);
    exit(0);
}


//lib/str_cli.c

//lib/str_cli.c
#include    "unp.h"

void
str_cli(FILE *fp,int sockfd)
{
    char sendline[MAXLINE],recvline[MAXLINE];
    while(Fgets(sendline,MAXLINE,fp) != NULL)
    {
        Writen(sockfd,sendline,strlen(sendline));
        if(Readline(sockfd,recvline,MAXLINE) == 0)
            err_quit("str_cli :server terminated prematually");
        Fputs(recvline,stdout);
    }
}


其中,writen,readline函数参见博客:

http://blog.csdn.net/kuzuozhou/article/details/7386666

 

fgets的用法:

fget函数的原型如下:char *fgets (char *buf, int n, FILE *fp)


功能:从文件流读取一行,送到缓冲区,使用时注意以下几点:

1.当遇到换行符或者缓冲区已满,fgets就会停止,返回读到的数据,

注意的是不能用fgets读二进制文件,因为fgets会把二进制文件当成文本文件来处理,这势必会产生乱码。

2.每次调用,fgets都会把缓冲区的最后一个字符设为 \0,这意味着最后一个字符不能用来存放需要的数据,

   所以如果有一行,含有 LINE_SIZE 个字符(包括换行符),要想把这行读入缓冲区,请把参数 n 设为 LINE_SIZE+1

  多留一个位置存储 \0

3. 由结论1可推出:给定参数n,fgets只能读取n-1个字符(包括换行符),如果有一行超过n-1个字符,

   那么fgets返回一个不完整的行,也就是说,只读取该行的前n-1个字符,但是,缓冲区总是以 \0 字符结尾,

   对fgets的下一次调用会继续读该行。

代码:

FILE* fp = fopen(argv[1], "r");
char buf[200];
while(fgets(buf, 200, fp) != NULL) {     /* 每行的字符不能超过199(包括换行符)才能正常工作 */
    printf("%s",buf);
}

相关文章推荐

UNIX网络编程学习(11)--分析TCP回射服务+客户程序:正常启动与正常终止

分析TCP回射服务+客户程序: 启动服务器程序后,netstat -a,后终端出现: Active Internet connections (servers and established) ...

Unix网络编程 chapter5 TCP回射服务器程序winsock改写

sever: #include"WinSock2.h" #include "time.h" #include "stdio.h" #include #include #pragma comm...

《UNIX网络编程 卷1》 笔记: 使用poll函数的单进程TCP回射服务器程序

本节我们使用poll函数来实现单进程TCP回射服务器。poll函数与select函数不同,它不使用描述符集,而是使用pollfd结构体数组,pollfd结构体如下: struct pollfd ...

unix网络编程各种TCP客户-服务器程序设计实例(三)

第五种  TCP预先派生子进程服务器程序: 对预先派生子进程服务器的最后一种改动就是由父进程调用accept,然后再将所接受的已连接描述字传递给子进程。父进程必须跟踪子进程的忙闲状态,以便给空闲子进...

Unix网络编程 深入探索TCP客户/服务器程序

简介:coding…服务器客户
  • guguant
  • guguant
  • 2016年09月21日 01:12
  • 232

《UNIX网络编程 卷1》 笔记: TCP 客户/服务器程序示例

本节我们实现一个简单的TCP回射服务器和客户程序,来说明一个典型的TCP服务器程序和客户程序如何工作。 TCP回射服务器程序的功能很简单,就是将客户发送过来的数据再返回给客户。 TCP回射客户程序...

UNIX网络编程卷一 笔记 第五章 TCP客户/服务器程序示例

1     概述 本章主要实现的程序模型: 2     TCP回射服务器程序 服务器与客户程序约定一个固定的端口,要比5000大,比49152小。 fork后子进程第一件事就是关掉...
  • fz_ywj
  • fz_ywj
  • 2013年06月18日 23:05
  • 956

UNIX网络编程笔记 第五章 TCP客户/服务器程序示例

TCP客户/服务器程序示例 信号 就是告知某个进程发生了某个事件的通知,有时也称为软中断(硬中断是硬件发给内核的)。信号通常是异步发生的,就是说进程预先不知道信号发生的准确时刻。 信号可以: 1)...

unix网络编程各种TCP客户-服务器程序设计实例(二)

本节我们接着介绍另外的几种TCP客户-服务器程序; 第四种:TCP并发服务器,每个客户一个子线程 在我们前面的并发服务器程序例子中可以看出:父进程接受连接,派生子进程,子进程处理与客户的交互。 ...

UNIX 网络编程 卷一:套接字联网API(第3版) 读书笔记(5) 第五章 TCP客户/服务器程序示例

一、POSIX信号处理二、处理SIGCHLD信号三、wait和waitpid函数四、SIGPIPE信号  
  • sky1737
  • sky1737
  • 2011年03月28日 22:16
  • 518
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UNIX网络编程(10)--TCP 回射服务器程序和客户程序
举报原因:
原因补充:

(最多只允许输入30个字)