网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月15日漏签0天
linux编程吧 关注:27,667贴子:11,825
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 3回复贴,共1页
<<返回linux编程吧
>0< 加载中...

求高手解答 linux实现服务器转发信息,让每个客户端自由通信!!!

  • 只看楼主
  • 收藏

  • 回复
  • zgr51729
  • 初涉江湖
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
本人写的服务器:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
void sig_handler(int signo)
{     pid_t pid;
     int stat;
     pid=waitpid(-1,&stat,WNOHANG);
     while(pid>0){
         printf("child process terminated (PID: %ld)\n",(long)getpid());
         pid=waitpid(-1,&stat,WNOHANG);
     }
     return;
}
int main(int argc,char *argv[])
{
     socklen_t clt_addr_len;
     int listen_fd;
     int com_fd;
     int ret;
     int i;
     static char recv_buf[1024];    
     int len;
     int port;
     pid_t pid;
     struct sockaddr_in clt_addr;
     struct sockaddr_in srv_addr;
     if(argc!=2){
         printf("Usage: %s port\n",argv[0]);
         return 1;
     }
     port=atoi(argv[1]);
     if(signal(SIGCHLD,sig_handler)<0){
         perror("cannot set the signal");
         return 1;
     }
     listen_fd=socket(PF_INET,SOCK_STREAM,0);
     if(listen_fd<0){
         perror("cannot create listening socket");
         return 1;
     }
     memset(&srv_addr,0,sizeof(srv_addr));
     srv_addr.sin_family=AF_INET;
     srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
     srv_addr.sin_port=htons(port);
     ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
     if(ret==-1){
         perror("cannot bind server socket");
         close(listen_fd);
         return 1;
     }
     ret=listen(listen_fd,5);
     if(ret==-1){
         perror("cannot listen the client connect request");
         close(listen_fd);
         return 1;



  • zgr51729
  • 初涉江湖
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
     }
         while(1){
         len=sizeof(clt_addr);
         com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
         if(com_fd<0){
             if(errno==EINTR){
                 continue;
             }else{
                 perror("cannot accept client connect request");
                 close(listen_fd);
                 return 1;
             }
         }
                
                 printf("%d\n",com_fd);
                 printf("%s\n",inet_ntoa(clt_addr.sin_addr));
         pid=vfork();
         if(pid<0){perror("cannot create the child process");
             close(listen_fd);
             return 1;
         }else if(pid==0){
             while((len=read(com_fd,recv_buf,1024))>0){
                                 printf("%d\n",com_fd);
                 recv_buf[len] = '\0';
                 printf("Message from client(%d): %s\n",len,recv_buf);
                 if(recv_buf[0]=='@')
                     break;
                 for(i=0;i<len;i++)
                     recv_buf[i]=toupper(recv_buf[i]);



2025-08-15 13:34:07
广告
不感兴趣
开通SVIP免广告
  • zgr51729
  • 初涉江湖
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
                 write(com_fd,recv_buf,len);
             }
         close(com_fd);
         return 0;
         }else
             close(com_fd);
     }    
         return 0;
}
客户端:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netdb.h>
#include<unistd.h>
int main(int argc,char *argv[])
{
     int connect_fd;
     int ret;
     char snd_buf[1024];
     int i;
     int port;
     int len;
     static struct sockaddr_in srv_addr;
     if(argc!=3)
       {
         printf("Usage:%s server_ip_address port\n",argv[0]);
         return 1;
       }
    
     port=atoi(argv[2]);
     connect_fd=socket(PF_INET,SOCK_STREAM,0);
     if(connect_fd<0)
         {
           perror("Cannot create communication scoket");
           return 1;
         }
     memset(&srv_addr,0,sizeof(srv_addr));
     srv_addr.sin_family=AF_INET;
     srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
     srv_addr.sin_port=htons(port);
     ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
     if(ret==-1)
         {
         perror("cannot connect to the server");
         close(connect_fd);
         return 1;
         }
        
     memset(snd_buf,0,1024);
     while(1)
       {
           write(STDOUT_FILENO,"input message:",14);
           len=read(STDIN_FILENO,snd_buf,1024);
           if(len>0)
               {
                 write(connect_fd,snd_buf,len);
               }
         len=read(connect_fd,snd_buf,len);
         if(len>0)
             {
             snd_buf[len]='\0';
             printf("Message from server:%s\n",snd_buf);
             }
         
          if(snd_buf[0]=='@') break;
       }
   
    close(connect_fd);
    return 0;
}
现在服务器与客户端通信是单一的,即不能使两个客户端自由通信,请问有什么技术或者方法,可以使多个服务器之间可以相互通信。像QQ一样,高手帮帮忙!!x谢谢!!
大家留意一下 服务器代码里面那句:com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
这个com_fd无论接受了多少个连接,都不会发生变化,为什么呢?理论上每有一个新连接产生,就会有一个新com_fd出现啊,真奇怪。


  • 夕阳武士·CN
  • 江湖少侠
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你那连接不是在父进程中都关闭了,他还变化啥了


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 3回复贴,共1页
<<返回linux编程吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示