免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3924 | 回复: 8
打印 上一主题 下一主题

如何实现tcp服务端对多台电脑通讯? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-21 13:12 |只看该作者 |倒序浏览
服务端:
-----------------------------server.c----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <netdb.h>
#include <pthread.h>
#include <openssl/md5.h>
#include <sys/select.h>
#include <string.h>
#define MAX 512

     int sock_listen(void)
{

        char *string="server return ok";
        socklen_t clt_addr_len;
        int listen_fd;
        int com_fd;
        int ret;
        int i,num;
        static char recv_buf[1024];   
        int len;
        int port;
        pid_t pid;
        struct sockaddr_in clt_addr;
        struct sockaddr_in srv_addr;
        struct timeval wait_time;
        fd_set read_fds;
        port=5050;
        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;
        }

        while(1){
                wait_time.tv_sec=3;
                wait_time.tv_usec=0;
                FD_ZERO(&read_fds);
                FD_SET(listen_fd,&read_fds);

                num=select(listen_fd+1,&read_fds,NULL,NULL,&wait_time);
                if(num<0)
                {
                perror("select error");
                        continue;
                }
                if(FD_ISSET(listen_fd,&read_fds)){
                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;
                        }
                }

                len=read(com_fd,recv_buf,1024);
                printf("Message client(%d): %s\n",len,recv_buf);
            //    write(com_fd,string,strlen(string));
                    }

        }
        return 0;

}


  int main(int argc,char **argv)
{


        sock_listen();
         }


----------------------------------client---------------------------------
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <netdb.h>
#include <pthread.h>
#include <openssl/md5.h>
#include <sys/select.h>
#include <string.h>
#define MAX 512
   int act_sock(void)
        {
        int sockfd;
  char *str="i'm local server";
        int len;
        struct sockaddr_in address;
        int result;
        char ch[100];
        while(1){
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr("127.0.0.1");
        address.sin_port = htons(5050);
        len = sizeof(address);
        result = connect(sockfd, (struct sockaddr *)&address, len);
        if(result == -1){
                perror("oops: client1");
                sleep(1);
                  close(sockfd);
        }
                 write(sockfd,str,strlen(str));
           // read(sockfd,ch,99);
                 printf("%s\n",ch);
                  sleep(2);
                close(sockfd);
        }



}


  int main(int argc,char **argv)
{
      act_sock();
                   }



我在上一对一可以正常通讯,如果加多几客户端端,就会出现
cannot accept client connect request: Too many open files
     不能实现一对多通讯,第一次写一对多,望各位大侠帮帮

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
2 [报告]
发表于 2008-11-21 13:25 |只看该作者
不设置的话最多能打开1024个文件描述符

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
3 [报告]
发表于 2008-11-21 13:26 |只看该作者
执行ulimit -n1000000 再运行你的程序
另外也没有看到服务端关闭套接字

论坛徽章:
0
4 [报告]
发表于 2008-11-21 13:35 |只看该作者
原帖由 xinglp 于 2008-11-21 13:26 发表
执行ulimit -n1000000 再运行你的程序
另外也没有看到服务端关闭套接字



兄弟我要实现一对多的方怎么办,而且在执行的时候有个错误
正常的情况下服务器接收到客户1应该接收i'm local server
    接收到客户2应该是:i'm 99

服务器却收到这样的信息:
Message client(16): i'm local server
Message client(6): i'm 99cal server
Message client(16): i'm local server
Message client(6): i'm 99cal server
Message client(16): i'm local server
Message client(6): i'm 99cal server
Message client(16): i'm local server
Message client(6): i'm 99cal server



   客户端里面多接收了 cal server 不知道为什么?????????????????????????????????????????????

[ 本帖最后由 udb6688 于 2008-11-21 13:36 编辑 ]

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
5 [报告]
发表于 2008-11-21 14:06 |只看该作者

回复 #1 udb6688 的帖子

只打开连接而不关闭,无论多少文件描述符都不够用

论坛徽章:
0
6 [报告]
发表于 2008-11-21 14:27 |只看该作者
原帖由 timespace 于 2008-11-21 14:06 发表
只打开连接而不关闭,无论多少文件描述符都不够用

兄弟有没有什么别的方法

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
7 [报告]
发表于 2008-11-21 14:43 |只看该作者
在 len=read(com_fd,recv_buf,1024);
后面加判断,
if (len <=0) close(com_fd);

论坛徽章:
0
8 [报告]
发表于 2008-11-21 16:37 |只看该作者
原帖由 syncpk99 于 2008-11-21 14:43 发表
在 len=read(com_fd,recv_buf,1024);
后面加判断,
if (len  



为什么会出现这样呢

Message client(16): i'm local server
Message client(6): i'm 99cal server
Message client(16): i'm local server
Message client(6): i'm 99cal server
Message client(16): i'm local server
Message client(6): i'm 99cal server
Message client(16): i'm local server
Message client(6): i'm 99cal server
Message client(16): i'm local server
正常的情况下应该是:

Message client(16): i'm local server
Message client(6): i'm 99
Message client(16): i'm local server
Message client(6): i'm 99
Message client(16): i'm local server
Message client(6): i'm 99c
Message client(16): i'm local server
Message client(6): i'm 99
Message client(16): i'm local server

论坛徽章:
0
9 [报告]
发表于 2008-11-21 17:13 |只看该作者

回复 #8 udb6688 的帖子

memset(recv_buf,0,sizeof(recv_buf);
另外你的模型问题很多 再好好研究下,如果能对付你的需求你可以先对付
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP