当前位置:  技术问答>linux和unix

菜鸟求助多线程并发服务器

    来源: 互联网  发布时间:2016-12-10

    本文导语:  本人菜鸟,刚刚看过unix网络编程,试着写了一个简单的多线程的并发服务器,可是只能给客户端发送信息,却接收不到客户端发给服务器的信息,用netstat -t 发现,程序的接收队列里有数据,但程序却没接收到,还...

本人菜鸟,刚刚看过unix网络编程,试着写了一个简单的多线程的并发服务器,可是只能给客户端发送信息,却接收不到客户端发给服务器的信息,用netstat -t 发现,程序的接收队列里有数据,但程序却没接收到,还请高手帮忙
程序如下

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//#include "lookup3.h"
#include "my.h"

#define PORT 6800
#define BUFSIZE 255

void *chat(int *clifd);
struct user usr[59];

int main(int argc, char **argv)
{
int servfd, clifd;
struct sockaddr_in servaddr, cliaddr;
pthread_t thread;
pthread_attr_t thread_attr;
char buffer[BUFSIZE];
int ret, len;
long hashvalue;
int opt = SO_REUSEADDR;

servfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(servfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

bzero(&servaddr, sizeof(cliaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

ret = bind(servfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
if(ret == -1) {
printf("bind failed.n");
exit(-1);
}

ret = listen(servfd, 10);
if(ret == -1){
printf("listen error!n");
exit(-1);
}
printf("server is waiting here...n");

len = sizeof(cliaddr);

while(1){

clifd = accept(servfd, (struct sockaddr *)&cliaddr, &len);
if(clifd == -1){
printf("accept failed.n");
break;
}

memset(buffer, 0, BUFSIZE);
printf("connect from: %s,%dn", inet_ntop(AF_INET, &cliaddr.sin_addr, buffer,BUFSIZE), ntohs(cliaddr.sin_port));

// pthread_attr_init(&thread_attr);
// pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
ret = pthread_create(&thread, NULL, chat, &clifd);
if(ret == -1){
printf("create chat thread failed.n");
close(clifd);
break;
}
}

close(servfd);
}

void *chat(int *clifd){
fd_set rset;
int sockfd, maxfd;
char buffer[BUFSIZE]; //鎺ユ敹锛?鍙戦€佺紦鍐插尯
int ret;

printf("thread created.n");

sockfd = *clifd;
FD_ZERO(&rset);
maxfd = sockfd>fileno(stdin)?sockfd:fileno(stdin) + 1;

while(1){
FD_SET(sockfd, &rset);
FD_SET(fileno(stdin), &rset);
ret = select(maxfd, &rset, NULL, NULL, NULL);
if(ret == -1){
printf("select failed in sockfd: %dn", sockfd);
close(sockfd);
pthread_exit((void *)(-1));
}

if(FD_ISSET(fileno(stdin), &rset)){
bzero(buffer, BUFSIZE);
fgets(buffer, BUFSIZE, stdin);

ret = send(sockfd, buffer, strlen(buffer), 0);
if(ret == -1){
printf("send failed.n");
}
}
if(FD_ISSET(sockfd, &rset)){
memset(buffer, 0, BUFSIZE);
ret = read(sockfd, buffer, BUFSIZE);
if(ret == -1){
printf("recv failed.n");
}
else if(ret == 0){
printf("the other side shut down.n");
close(sockfd);
pthread_exit((void *)1);
}
else
printf("client: %sn", buffer);
}
}
}


|
maxfd = sockfd>fileno(stdin)?sockfd:fileno(stdin) + 1;
该为:
maxfd = sockfd>fileno(stdin)?sockfd+1:fileno(stdin) + 1;
试试

|
1个客户端的情况下也是这样吗

把FD_ZERO(&rset); 放在循环里面呢?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ----菜菜鸟第三问:-菜鸟菜问:JAVA如何求 根号、开次方? -----
  • 菜鸟问一个关于j2ee的菜鸟问题
  • 怎样从一个菜鸟级的java programer升级到一个菜鸟级的java developer
  • 一个连菜鸟都算不上的菜鸟
  • 菜鸟求问菜鸟问题 ,域名绑定
  • ===菜鸟系列===:写过毕业论文的前辈请进!!!菜鸟散分啦!!!!
  • gcc问题---菜鸟发问之一,老大们帮忙啊!!菜鸟分不多,只好给这点了,对不起!!
  • 菜鸟又来问菜鸟问题了
  • 菜鸟的Linux练习疑问……
  • 菜鸟刚学jsp,还不知道怎么和sql server2000的数据库相连,我已经把odbc配好了,谁能给我一段和数据库相连的并显示所有数据的代码!菜鸟
  • 菜鸟提问,我怎么装redhat7。1
  • 菜鸟写的俄罗斯方块,请多多批评!
  • 小问题,你一定能够帮忙!——菜鸟请求帮忙!!
  • 一个菜鸟的请求: 哪位前辈能给晚辈讲讲“匿名类”
  • ※菜鸟送分之一※ Red Hat Linux 的最高版本是多少?
  • 菜鸟问题:在Java中如何接收从键盘输入的字符串?
  • ★菜鸟问:怎么在RED HAT LINUX7.2中用169上网??
  • 菜鸟提问:包是什么概念?
  • 菜鸟问题~~快点进来拿分
  • 菜鸟菜问题1


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3