首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

局域网聊天的linux c C/S模式遇到有关问题

2013-01-12 
局域网聊天的linux c C/S模式遇到问题。最近刚开始接触编程,http://blog.chinaunix.net/uid-25530360-id-35

局域网聊天的linux c C/S模式遇到问题。
最近刚开始接触编程,http://blog.chinaunix.net/uid-25530360-id-351062.html(我不是托,因为是参考这里的)看到这里的程序感兴趣就想模仿一个。在粗略看了一遍源码的情况下自己模仿写了一个,但是依然出现问题,改了一个多星期不成功,索性改成几乎跟别人写的基本没区别了。但还是不行,只能恳请各各位朋友指点指点啦。下面是源码(只有第一个链接到服务器的客户端可以说话,其他的只能接收,而不能发话)
////////////////////////////////////////////////////
客户端:
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<strings.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#define MAXLINE 80
void main()
{
  int fd,n,p=0;
  char c,x,buf[MAXLINE];
  struct sockaddr_in aip;
  pid_t pid;
  fd=socket(AF_INET,SOCK_STREAM,0);
  bzero(&aip,sizeof(aip));
  aip.sin_family = AF_INET;
  inet_pton(AF_INET,"127.0.0.1",&aip.sin_addr);
  aip.sin_port=htons(5678);
  // inet_aton("127.0.0.1",&aip.sin_addr);
  connect(fd,(struct sockaddr *)&aip,sizeof(aip));
  while(1)
    {
      pid=fork();
      if(pid < 0)
{
  printf("fork failed");
  exit(1);
}
      if(pid == 0)
{   
  p=read(fd,buf,MAXLINE);
  if(p==0)
    printf("the other client has been shutdown");
  else
  write(STDOUT_FILENO,buf,p); 
  //  exit(0); 
}
      else
{
  {
    fgets(buf,MAXLINE,stdin);
    write(fd,buf,strlen(buf));
    //  close(fd);
  }
}      
    }   
  close(fd); 
}

////////////////////////////服务器端
#include<sys/socket.h>
#include<sys/types.h>
#include<stdio.h>
#include<strings.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<sys/select.h>
#include<sys/time.h>
#define BACKLOG 20
#define MAXLINE 80
int main()
{
  int fd,secondefd,i=0,client[1024],j=0,sockfd,k=0,counti=-1,max=-1,clientfd=0,p=0;
  struct sockaddr_in aip,hint;
  char c,buf[MAXLINE],str[INET_ADDRSTRLEN];;
  socklen_t sock_size;
  pid_t pid;
  fd_set jh,jh2;

  fd = socket(AF_INET,SOCK_STREAM,0);
  bzero(&aip,sizeof(aip));

  aip.sin_family=AF_INET;
  aip.sin_addr.s_addr=htonl(INADDR_ANY);
  aip.sin_port=htons(5678);

  bind(fd,(struct sockaddr *)&aip,sizeof(aip));
  listen(fd,BACKLOG);
  
  for(i=0;i<FD_SETSIZE;i++)
    client[i]=-1;
  max=fd;//最大文件描述符
  FD_ZERO(&jh);
  FD_SET(fd,&jh);
 
  while(1)
    {
       jh2=jh;
      // k=select(max+1,&jh,NULL,NULL,NULL);
       k=select(max+1,&jh2,NULL,NULL,NULL);
      if(k<0)
      {


printf("fork");
     exit(1);
      }

      if(FD_ISSET(fd,&jh2))
{
  sock_size=sizeof(hint);
  secondefd = accept(fd,(struct sockaddr *)&hint,&sock_size);
  
  printf("received from %s at PORT %d\n",
        inet_ntop(AF_INET, &hint.sin_addr, str, sizeof(str)),
        ntohs(hint.sin_port));  
 
  for(i=0;i<FD_SETSIZE;i++)
    {
      if(client[i]<0)

  client[i]=secondefd;
  if(counti<i)
  counti=i;
  break;
}
    }
  FD_SET(secondefd,&jh);
  if(secondefd>max)
    {
      max=secondefd;
    }
   if(--k==0)
   continue;
}   


   
      for(i=0;i<=counti;i++)
{
  if((clientfd = client[i])<0) 
    continue;
  if(FD_ISSET(clientfd,&jh2));
  {
    if((p=read(clientfd,buf,MAXLINE))==0)
      {
close(clientfd);
client[i]=-1;
FD_CLR(clientfd,&jh);
      }
    else
      {
for(i=0;i<=counti;i++)
  write(client[i],buf,p);
      }
    if(--k==0)
      break;
  }
          
}
    
    }
}
[解决办法]
嗯,可以那么理解哦。

i的那种用法跟你说的一样,有一定的风险,倒不觉得这种用法效率高。

热点排行