linux网络编程一对多,Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,网络编程的“Hello World!” - 壮壮熊...

在linux平台下,用多线程实现echo服务器与客户端“一对多”(即 是一台服务器可以响应多个客户端的请求 )。本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊。

编译时,在后面加上-lpthread。例如: g++ service2.cpp -o service2 -lpthread 。否则会提示线程方面的错误。

echo服务器端代码:

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define SERVERIP "192.168.1.117"

#define SERVERPORT 12345

#define MAXBUFFER 256

pthread_t ntid;//线程

int connfd;//客户端连接的ID

struct sockaddr_in clientaddr;

void *printContext(void *arg)

{

char ip[40]={0};//用来存放客户端连接的IP地址

char readBuf[MAXBUFFER]={0};

int ret;

pthread_detach(ntid);//线程退出时,可以清理内存

int pconnfd=connfd;//客户端连接的ID(main函数中的accept的返回值)

//线程自己要保存连接符 ID,因为进程在第二个客户端

//连接后,会覆盖connfd

printf("%s\n",inet_ntop(AF_INET,&clientaddr.sin_addr,ip,sizeof(ip)));

cout<

while(ret=read(pconnfd,readBuf,MAXBUFFER))//读客户端发送的数据

{

write(pconnfd,readBuf,MAXBUFFER);//写回客户端

printf("%s\n",readBuf);//打印传输的内容

bzero(readBuf,MAXBUFFER);

}

if(ret==0)

{

printf("the connection of client is close!\n");

}else

{

printf("read error:%s\n",strerror(errno));

}

pthread_exit(0);

}

int main(int argc,char** argv)

{

socklen_t len;//socket长度类型

int serverFd,ret;

struct sockaddr_in serveraddr;

serverFd=socket(AF_INET,SOCK_STREAM,0);//创建socket

if(serverFd<0)

{

printf("socket error:%s\n",strerror(errno));

exit(-1);

}

bzero(&serveraddr,sizeof(serveraddr));//serveraddr清零

serveraddr.sin_family=AF_INET;

serveraddr.sin_port=htons(SERVERPORT);

inet_pton(AF_INET,SERVERIP,&serveraddr.sin_addr);//将C语言字节序转化成网络字节序

ret=bind(serverFd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));

if(ret!=0)

{

close(serverFd);

printf("bind error:%\n",strerror(errno));

exit(-1);

}

ret=listen(serverFd,5);//监听

if(ret!=0)

{

close(serverFd);

printf("listen error:%s\n",strerror(errno));

exit(-1);

}

//clientaddr清零

len=sizeof(clientaddr);

bzero(&clientaddr,sizeof(clientaddr));

while(1)

{

//接收客户端的连接,然后启动线程去处理客户端发送的

//请求。线程只要保存connfd 即可。进程在第二个客户  端

//连接进来的时候,会覆盖第一个客户端的connfd

connfd=accept(serverFd,(struct sockaddr *) &clientaddr,&len);

if(connfd<0)

{

printf("accept error:%s\n",strerror(errno));

continue;

}

int err;

err=pthread_create(&ntid,NULL,printContext,NULL);

if(err!=0)

{

cout<         }

//close(connfd);

}

close(serverFd);

return 0;

}

客户端代码:

#include#include#include#include#include#include#include#include

#define SERVERIP "192.168.1.117"

#define SERVERPORT 12345

#define MAXBUFFER 256

int main(int argc,char** argv)

{

int clientFd,ret;

struct sockaddr_in serveraddr;

char buf[MAXBUFFER];

clientFd=socket(AF_INET,SOCK_STREAM,0);//创建socket

if(clientFd<0)

{

printf("socket error:%s \n",strerror(errno));

exit(-1);

}

bzero(&serveraddr,sizeof(serveraddr));

serveraddr.sin_family=AF_INET;

serveraddr.sin_port=htons(SERVERPORT);

inet_pton(AF_INET,SERVERIP,&serveraddr.sin_addr);

//连接到服务器

ret=connect(clientFd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));

if(ret!=0)

{

close(clientFd);

printf("connect error:%s \n",strerror(errno));

exit(-1);

}

while(1)

{

bzero(buf,sizeof(buf));

scanf("%s",buf);

write(clientFd,buf,sizeof(buf));//写数据

bzero(buf,sizeof(buf));

read(clientFd,buf,sizeof(buf));//读数据

printf("echo:%s\n",buf);

}

close(clientFd);

return (EXIT_SUCCESS);

}

再次提醒,编译时,在后面加上-lpthread。例如:g++ service2.cpp -o service2 -lpthread。否则会提示线程方面的错误。

如有转载,请注明出处,谢谢!

from: http://www.tuicool.com/articles/MrIJZn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值