服务器与多个客户端通信

使用多路复用实现一个服务器与多个客户端的通信:代码范例:
服务器:
#include<stdio.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<pthread.h>
#include<strings.h>

void send1(int *a)
{
    int i;
    char buf[20];
    bzero(buf,20);
    fgets(buf,20,stdin);
    for(i=0;i<12;i++)
    {    if(a[i] !=0)
        send(a[i],buf,20,0);
    }
}
int main()
{
    int fds[12]={0};
    int maxfd = -1;
    int socketfd = socket(PF_INET,SOCK_STREAM,0);
    if(socketfd>maxfd)
        maxfd = socketfd;
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = PF_INET;
    saddr.sin_port = htons(6000);
    saddr.sin_addr.s_addr = inet_addr("192.168.1.46");
    int newsocketfd;
    int n = 1;
    setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(int));
    if(bind(socketfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr_in))<0)
        perror("bind() error!\n");

    if(listen(socketfd,5)<0)
        perror("listen() error!\n");
    struct sockaddr_in caddr;
    int s = sizeof(struct sockaddr);
//    newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s);
    fd_set fd;
    FD_ZERO(&fd);
    int ret;
    char buf[20],buf1[20];
    int i;
    int rsize;
    while(1)
    {
        FD_ZERO(&fd);
        FD_SET(0,&fd);
        FD_SET(socketfd,&fd);
        for(i=0;i<12;i++)
        {
    //    printf("--------------\n");
            if(fds[i]!=0)
            FD_SET(fds[i],&fd);
        }
        ret = select(maxfd+1,&fd,NULL,NULL,NULL);
        if(ret<0)
        {
            perror("select() error!\n");
            break;
        }
        else if(ret ==0)
        {
            continue;
        }
        else
        {
            if(FD_ISSET(socketfd,&fd))
            {
                newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s);
            if(newsocketfd>maxfd)
            {
    //    printf("--------------\n");
                maxfd = newsocketfd;
                for(i=0;i<12;i++)
                {
                    if(fds[i]==0)
                    {
                        fds[i] = newsocketfd;
                        break;
                    }
                }

            }
            continue;
            }
//            printf("helo\n");
            for(i=0;i<12;i++)
            {
                if(fds[i] !=0 && FD_ISSET(fds[i],&fd))
                {
                    bzero(buf1,20);
                    if(recv(fds[i],buf1,20,0)==0)
                    {
                        close(fds[i]);
                        fds[i] = 0;
                    }
                    printf("%s",buf1);
                }
            }
                if(FD_ISSET(0,&fd))
                {
                    send1(fds);
                }
    }
    }
    close(socketfd);
    close(newsocketfd);

}
客户端:
#include<stdio.h>
#include<pthread.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
#include<strings.h>
#include<sys/types.h>
#include<sys/socket.h>
int main()
{
    int socketfd,ret;
    fd_set fd;
    FD_ZERO(&fd);
    FD_SET(0,&fd);

    socketfd = socket(PF_INET,SOCK_STREAM,0);
    FD_SET(socketfd,&fd);
    ret = select(socketfd+1,&fd,NULL,NULL,NULL);
    struct sockaddr_in saddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = PF_INET;
    saddr.sin_port = htons(6000);
    saddr.sin_addr.s_addr = inet_addr("192.168.1.46");

    if(connect(socketfd,(struct sockaddr *)&saddr,sizeof(struct sockaddr))<0)

        perror("connect() error!\n");
//    pthread_t pthreadid;
//    pthread_create(&pthreadid,NULL,func,NULL);
    char buf[20],buf1[20];
    while(1)
    {
        bzero(buf,20);
        bzero(buf1,20);

    FD_SET(0,&fd);
    FD_SET(socketfd,&fd);
    ret = select(socketfd+1,&fd,NULL,NULL,NULL);
            if(FD_ISSET(socketfd,&fd))
            {
            if(recv(socketfd,buf1,sizeof(buf1),0)<0)
                perror("recv() error!\n");
                printf("%s",buf1);
                continue;
            }
            if(FD_ISSET(0,&fd))
            {
            fgets(buf,20,stdin);
            if(send(socketfd,buf,strlen(buf),0)<0)
            perror("send() error!\n");
            continue;
            }    

        }
时间: 2024-10-18 09:43:27

服务器与多个客户端通信的相关文章

UDP 服务器与多个客户端通信

服务端为上位机部分.客户端为下位机部分,下位机有多个MCU,所以就会有不同的IP地址.上位机实现接收下位机的信息,并区别不同的IP发来的信息.通信端口5000 服务端:IP设置为196.168.1.100   int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);     if(sock_fd < 0)     {         printf("error: Create Socket Failed!");         return -1

JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo

OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 TCP/IP协议 TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP.TCP称为传输控制协议,IP称为互联网络协议. 网络分层除了OSI模型分层,还有TCP/IP模型分层,将网络划分为四层,应用层.传输层.网际层

C#使用Socket实现一个socket服务器与多个socket客户端通信

在分布式调度系统中,如果要实现调度服务器与多台计算节点服务器之间通信,采用socket来实现是一种实现方式,当然我们也可以通过数据存储任务,子节点来完成任务,但是往往使用数据作为任务存储都需要定制开发,要维护数据库中任务记录状态等等.开发的东西还是有点多,而且还不够灵活.因此,我个人是比较偏向于使用socket来实现任务的调度工作.原因:使用socket实现调度比较灵活,而且扩展性都比较好. 实现思路:调度服务器要实现调度工作,它必须与所有计算节点之间建立连接.而且他需要知道每台计算节点的任务状

java服务器与linux c客户端之间udp通信

java服务器和 linux c客户端采用udp协议互相通信,最关键的点是数据结构的统一.比如说,在c中一个char型 是8bit,在java中,char 是16bit,所以c和java的char类型不能直接互相转换.在本例程中,c的char 类型和 java的byte类型,两个数据类型都是8bit,这样就保证了数据正确传输的基本条件之一. java服务器代码如下: import java.io.*; import java.lang.*; import java.net.*; public c

(转)C# Socket简单例子(服务器与客户端通信)

本文转载自:http://blog.csdn.net/andrew_wx/article/details/6629721 这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信. 注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序.在这个例子中,实际上还有很多问题没有解决,如消息边界问题.端口号是否被占用.消息命令的解析问题等.. 下面是两个程序的代码,(两个程序均为控制台程序) 先发服务端的(Server)完整代码如下: 引入命名空间: [cshar

Python全栈__服务器与多客户端通信、UDP协议、pycharm打印带颜色输出、时间同步的机制

1.服务器与多客户端通信 1 import socket 2 # 创建tcp socket的套接字 3 sk = socket.socket() 4 # bind 5 sk.bind(('127.0.0.1',8080)) 6 # 监听 7 sk.listen(5) 8 # 等待连接 9 while 1: 10 conn, addr = sk.accept() 11 while 1: 12 msg_s = input('>>>') 13 conn.send(msg_s.encode('u

使用CBrother做TCP服务器与C++客户端通信

使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之所以不选择Python是因为python的语法我实在是适应不了,再来CBrother的网络框架也是用C++封装的异步IO,性能还是很有保证的. 废话不多说,先来看下服务器代码,我这里只是记录一个例子,不是全部代码,方便后面做项目的时候直接来自己博客复制代码修改. 1 import CBSocket.

【被C折腾系列】用C调DIOCP编码客户端通信

前几天有个朋友,说他们公司做手游,服务端用的DIOCP3里面做文件服务器,客户端用cocos-x,在调试与diocp通信时老是失败! 于是,我下载了一个Codeblocks经过几个小时的折腾,终于折腾出来了,把其中的一些心酸记录下,以便以后查阅. 1.windows下面使用socket的一些函数时,需要设置工程的选项或者工具的编译选项 [project –> build options]->[linker settings]或者[setting]->[complier]->Link

Windows Socket 编程_单个服务器对多个客户端简单通讯

单个服务器对多个客户端程序: 一.简要说明 二.查看效果 三.编写思路 四.程序源代码 五.存在问题 一.简要说明: 程序名为:TcpSocketOneServerToMulClient 程序功能:实现单个服务器对多个客户端通讯功能的小程序. PS: 这是继上次简单的 Tcp Windows Socket 编程后的再一程序,程序实现依然不是很严谨,还待完善~ 二.查看效果: 三.编写思路: 由上一次的程序思路来看,如果想实现单个服务器对多个客户端程序的通讯的话,这次程序编写尝试从多线程的角度来考