您的位置:首页 > 其它

并发服务器--02(基于多线程)

2015-07-12 12:05 381 查看
  这篇是继前三篇并发服务器--01(基于进程派生)并发服务器--02(基于I/O复用——运用Select函数)并发服务器--02(基于I/O复用——运用epoll技术)的第4篇关于并发服务器的博文。

  关于Linux上多线程详情请参看前一博文Linux多线程编程初探

  本文相对就简陋一点了,只记简单笔记,待后续有更丰富内容再添加。

客户端程序

/*#include "unp.h"*/
#include "unpthread.h"

void *copyto(void *);
void str_cli_thread(FILE *fp_arg, int sockfd_arg);
static int sockfd;        /* global for both threads to access */
static FILE *fp;

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

if(argc != 2)
err_quit("usage: tcpcli <IPaddress>");

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.s_addr);

Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));

str_cli_thread(stdin, sockfd);

exit(0);
}

void str_cli_thread(FILE *fp_arg, int sockfd_arg)
{
char recvline[MAXLINE];
pthread_t tid;

sockfd = sockfd_arg;
fp = fp_arg;

if(pthread_create(&tid, NULL, copyto, NULL) != 0)
{
printf("create thread fails");
return;
}

while(Readline(sockfd, recvline, MAXLINE) > 0)
Fputs(recvline, stdout);
}

void *copyto(void *arg)
{
char sendline[MAXLINE];

while(Fgets(sendline, MAXLINE, fp) != NULL)
Writen(sockfd, sendline, strlen(sendline));

Shutdown(sockfd, SHUT_WR);    /* EOF on stdin, send FIN */

return(NULL);
}


  编译链接时记得就-lunp和-lpthread。

服务端程序

#include "unpthread.h"

static void *doit(void *);    /* each thread executes this function */

int main(int argc, char **argv)
{
int listenfd, *iptr;
pthread_t tid;
socklen_t addrlen, len;
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);
for( ; ; )
{
addrlen = sizeof(cliaddr);
iptr = Malloc(sizeof(int));
*iptr = Accept(listenfd, (SA *) &cliaddr, &addrlen);
Pthread_create(&tid, NULL, &doit, iptr);
}

exit(0);
}

static void *doit(void *arg)
{
int connfd;
connfd = *((int *) arg);
free(arg);

Pthread_detach(pthread_self());
str_echo(connfd);    /* same function as before */
Close(connfd);
return(NULL);
}


参考资料

  《UNIX网络编程 卷1》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: