当前位置: 技术问答>linux和unix
socket中server端多线程的问题
来源: 互联网 发布时间:2016-09-18
本文导语: #include #include #include #include #include #include #include #include #include #define MYPORT 3490 #define BACKLOG 10 #define MAXDATASIZE 100 void *doClientThead(void *pParam) { char buf[MAXDATASIZE]; int cilentSocket=(int)pParam; int numbytes; ...
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3490
#define BACKLOG 10
#define MAXDATASIZE 100
void *doClientThead(void *pParam)
{
char buf[MAXDATASIZE];
int cilentSocket=(int)pParam;
int numbytes;
while(1)
{
if ((numbytes=recv(cilentSocket , buf, MAXDATASIZE, 0)) == -1) {
perror("接收信息错误");
break;
}
if(numbytes==0)
{
printf("客户端退出n");
break;
}
buf[numbytes] = '';
printf("收到来自客户端的信息: %sn",cilentSocket,buf);
}
close(cilentSocket);
printf("客户端 socket 已正常关闭!n");
close(cilentSocket);
}
main()
{
int sockfd, new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
int numbytes;
pthread_t pt;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket创建失败");
exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero), 8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("绑定端口失败");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("监听端口失败");
exit(1);
}
printf("服务器已经开始监听3490端口!n");
while(1) {
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
perror("接收信息错误");
continue;
}
printf("服务器已取得得来自客户端 %s的连接!n", inet_ntoa(their_addr.sin_addr));
if (send(new_fd, "连接成功n", 12, 0) == -1){
perror("发送连接信息失败");
continue;
}
//创建客户端进程
if(pthread_create(&pt,NULL,doClientThead,(void *)new_fd)!=0){//就是在这个地方的疑问
printf("客户端创建线程失败!n",new_fd);
exit(1);
}
}
}
多线程问题,我的实际情况是需要多台client同时连一台server,在server端每accept到一个client的请求就新开一个线程。代码如上,这其实是网络上搜到的代码,我的疑问在创建线程的地方。线程不同于进程,thread不是fork,所以我的理解是这里有多线程共享内存的问题,简单说,如上代码,每个线程进去执行doClientThead这个函数的时候会不会有冲突的可能,从变量上看,doClientThead里面如果没有静态没有全局就是可重入的,可重入的函数应该就不用考虑这样的问题,但是比如说recv这个或者别的什么有没有可能存在这样冲突的可能性?
|
这个地方有什么疑问么?
为了一个server处理多client,接收到请求之后,创建一个线程,让这个线程去处理新来的client,然后server
继续他的工作。
你的问题在于线程handler的问题。
严格意义上来说,printf其实都属于不可重入的函数。
除开这个,其他的基本都是可以重入的。
为了一个server处理多client,接收到请求之后,创建一个线程,让这个线程去处理新来的client,然后server
继续他的工作。
你的问题在于线程handler的问题。
严格意义上来说,printf其实都属于不可重入的函数。
除开这个,其他的基本都是可以重入的。