linux多线程与网络编程,linux多线程网络编程详解(包含具体例子讲解)

与多进程相同,采用多线程可以实现并发服务器,并且由于线程的系统开销小,切换时间短,对于需要处理大量客户的服务器而言其具有更大的优势,实现多线程并发服务器的基本流程是:当建立连接以后,服务器调用pthread_create()函数产生新的线程,由新的线程来处理客户端的请求,同时主线程等待另一个客户的连接请求,其中的典型的模板如下:

#include

#include

#include

#include

#include

#include

/***********function to be executed by the new thread**************/

void  *start_routine((void *)arg);

int main()

{

int listenf,connfd;

pthread_t tid;

type arg;

struct sockaddr_in servaddr,cliaddr;

/****************create the tcp sock *******************/

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(1032);

/******************************bind socket to address****************************/

bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

listen(listenfd,5);

while(1)

{

/********************accept the connection****************************/

clilen=sizeof(cliaddr);

connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);

/*************************create child to service client***************************************/

/********************************put the parameters to the arg*******************************************/

if(pthread_create(&tid,NULL,start_routine,(void *)arg))

{

//handle exception

................

eixt(0);

}

}//总之就是要实现多线程的功能就是把线程的申明放在建立连接之后

以下是实现 一次启动Server端和Client端后,首先由Server端发‘1’给Client端,Client端将接收到的数据加1后,发该数据给Server端,Server端再将数据加1后发给Client端,依次类推。直到Server端收到数据20,Client收到19时,两方中断收发功能的服务器和客户端的程序实现:(应用多线程网络编程实现)

# include

# include

# include

# include

# include

#include

void deal(int connfd1);

int main(int argc,char **argv)

{

int listenfd,connfd;

struct sockaddr_in servaddr,cliaddr;

//char  recvline[1024];

//char send[1024];

pthread_t tid;//用来申请作为线程用的语句

socklen_t   clilen;

int n=0;

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(1032);

bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));

listen(listenfd,5);

for(;;)

{

clilen=sizeof(cliaddr);

connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&clilen);

/****************************create thread*******************************/

if(pthread_create(&tid,NULL,deal,(void *)connfd))

{

printf("the create thread error");

exit(0);

}

}

close(listenfd);

return 0;

}

/****************the function of deal()***********************/

void deal(int connfd)

{

char recvline[1024];

char send[1024];

int n=0;

while(n<20)

{

n=n+1;

printf("the server send is:%d\n",n);

sprintf(send,"%d",n);

if(write(connfd,send,strlen(send))==0)

{

printf("the write error!");

exit(1);

}

/***********read the information****************/

if(read(connfd,recvline,1024)==0)

{

printf("the read error!");

exit(1);

}

n=atoi(recvline);

printf("the server accept is:%d\n",n);

}

close(connfd);

pthread_exit(NULL);

}

客户端的实现如下:

# include # include # include # include   # include #include int main(int argc,char **argv) { int sockfd; char recvline[100];         char sendline[100]; struct sockaddr_in servaddr;         struct hostcnt *h;         int n=0; if(argc!=2) {                 printf("usage:a.out ");             } if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) {                 printf("socket error!"); }            bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(1032);//把数值转换成网络字节值        if((inet_pton(AF_INET,argv[1],&(servaddr.sin_addr)))<0) {//把字符串型的形式转换成地址的格式                  printf("address error!\n"); } //建立与服务器的链接 if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)//本语句中之所以可以用servaddr是因为,客户端与服务器端的端口号和ip地址是一样的 {//一般情况下是通过指定servaddr来指定要链接的服务器的ip地址以及服务器的端口号来实现和服务器进行链接                    printf("connect error!\n"); }         while(n<19) {                 if(read(sockfd,recvline,1024)==0)                  { printf("read error!");                         exit(0); }                                n=atoi(recvline);                printf("the client accept is:%d\n",n);                sprintf(sendline,"%d",(n+1));      write(sockfd,sendline,strlen(sendline));               printf("the client send is:%d\n",(n+1));             } exit(0); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值