大神们空降这里求指导!!!!

wocawuliao 2013-11-24 12:18:46





//用int数组来保存与服务器连接成功的socket
if((clientfd[i] = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)) == -1)

{
perror("accept");
exit(1);

}else
{
i++;
}

printf("accept from:%d\n",inet_ntoa(their_addr.sin_addr));
send(clientfd[i-1],WELCOME,strlen(WELCOME),0);//发送问候信息
buf = (char *)malloc(255);

//显示accept()返回的描述符
printf("clientfh:%d",clientfd[i-1]);

ppid = fork();//创建子进程
if(ppid == 0)
{

pid = fork(); //创建子进程
while(1)
{
if(pid > 0)
{
int j;
for( j=0;j<i;j++){
if((recvbytes = recv(clientfd[j],buf,255,0)) <= 0)
{
perror("recv1");
close(clientfd[i-1]);
raise(SIGKILL);//raise()向正在执行的程序发送信号,
exit(1);
}else{break;}
}

//显示发送到缓冲区的消息和那个socket接受的
printf(" %s,%d\n",buf,clientfd[j]);

//要向那个客户端发送数据在buf的第一个字符
switch(buf[0])
{
case '0':choice=0;break;
case '1':choice=1;break;
case '2':choice=2;break;
case '3':choice=3;break;
case '4':choice=4;break;
default:break;
}




//在服务器显示内容

printf(" %s\n",buf);
//向指定客户端发送消息
if(send(clientfd[choice],buf,strlen(buf),0) == -1)
{
perror("send");
}

}

//一开始send()在下面的子进程里,可是子进程里的代码却执行不了于是我就放到上面去勒,准备再开改一下
else if(pid == 0)//子进程发送消息
{

if(send(clientfd[choice],buf,strlen(buf),0) == -1)
{
perror("send");
}





第35行clientfd数组里是i-1的时候后建立连接的客户端2可以向客户端1发送消息,但当客户端1向客户端2发送消息时服务器会显示send: Socket operation on non-socket,此时clientfd[i-1]恒等于是客户端2的描述符,所以我想因该是recv()函数那块处理的不好???
...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wocawuliao 2013-11-25
  • 打赏
  • 举报
回复
引用 1 楼 u011642451 的回复:
mark.....
??????

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧