RSS
当前位置 :| 主页>系统服务器>

Linux 系统下实现多线程客户/服务器

来源:网络 作者:本站整理 时间:2007-08-22 Tag: 点击:


    第五个函数:

    void pthread_exit(void *status);phpma.com;

    该函数终止线程。如果线程未脱离,其线程ID和退出状态将一直保留到调用进程中的某个其他线程调用pthread_join函数。指针status不能指向局部于调用线程的对象,因为线程终止时这些对象也消失。有两种其他方法可使线程终止:

    1. 启动线程的函数(pthread_creat的第3个参数)返回。既然该函数必须说明为返回一个void指针,该返回值便是线程的终止状态。

    2. 如果进程的main函数返回或者任何线程调用了exit,进程将终止,线程将随之终止。

    以下给出一个使用线程的TCP回射客户/服务器的例子,完成的功能是客户端使用线程给服务器发从标准输入得到的字符,并在主线程中将从服务器端返回的字符显示到标准输出,服务器端将客户端发来的数据原样返回给客户端,每一个客户在服务器上对应一个线程。利用该程序框架,通过扩展客户端和服务器端的处理功能,可以完成多种基于多线程的客户机/服务器程序。该程序在RedHat 6.0和TurboLinux4.02下调试通过。 共用头文件如下:(head.h)
phpma.com;
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #define MAXLINE 1024
    #define SERV_PORT 8000
    #define LISTENQ 1024
    static int sockfd;
          static FILE *fp;

    公用函数如下(common.c):

    /* 从一个描述字读文本行 */
    ssize_t readline(int fd, void *vptr, size_t maxlen)
    {
    ssize_t n, rc;
    char c, *ptr;
    for (n=1; n0)
    {
    if ( (nwritten=write (fd, ptr, nleft ) )〈=0 )
    {
    if (errno==EINTR )
    nwritten=0;
    else
    return (-1);
    }
    nleft-=nwritten;
    ptr++=nwritten;
          }

    客户端主程序如下:(client.c)

    #include “head.h“;
    #include “common.c“;
    /* 在str_cli中定义的要被线程执行的函数 */
    void *copyto (void *arg)
    {
    char sendline[MAXLINE];
    while (fgets (sendline,MAXLINE,fp) !=NULL )
    writen(sockfd,sendline,strlen(sendline));
    shutdown(sockfd,SHUT_WR);
    return(NULL);
    }
    void str_cli(FILE *fp_arg, int sockfd_arg)
    {
    char recvline[MAXLINE];
    pthread_t tid;
    sockfd=sockfd_arg;
    fp=fp_arg;
    pthread_creat(&tid, NULL, copyto, NULL);
    while (readline (sockfd,recvline,MAXLINE) 〉0)
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册