服务器端代码#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 3333    /*服务器监听端口号 */
#define BACKLOG 10    /* 最大同时连接请求数 */main()
{
    int sock_fd,client_fd;    /*sock_fd:监听socket;client_fd:数据传输socket */
    int sin_size;
    struct sockaddr_in my_addr;    /* 本机地址信息 */
    struct sockaddr_in remote_addr;    /* 客户端地址信息 */
    if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket创建出错!");
        exit(1);
    }
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(SERVPORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero),8);
    if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
        perror("bind出错!");
        exit(1);
    }
    if(listen(sock_fd, BACKLOG) == -1) {
        perror("listen出错!");
        exit(1);
    }
    while(1) {
        sin_size = sizeof(struct sockaddr_in);
        if((client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {
            perror("accept出错");
            continue;
        }
        printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
        if(!fork()) {    /* 子进程代码段 */
            if(send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) {
                perror("send出错!");
            }
            close(client_fd);
            exit(0);
        }
        close(client_fd);
    }
}
服务器端就只有一个SOCKET在监听,如果有5个客户端连接到服务器端,服务端如何区分这5个不同的客户端呀?请高手帮助

解决方案 »

  1.   

    accept接收连接后,就可以用一个socket与客户端建立连接,然后就可以保存所有的客户端到一个列表..并保存ip地址等.
      

  2.   

    accept成功後新建一個socket來連接 這個socket還是在此listen
      

  3.   

    建立一个socket列表
    fork之后
    在子进程里面开个新的socket连接它
    并把这个socket存进列表
    可以用IP索引
      

  4.   


    没搞清楚楼上各位说什么哪里能见到SOCKET列表?服务器端就两个SOCKET,分别是client_fd和 sock_fd现在客户端有5个,怎么在服务器端区分?各位能不能结合具体代码说明一下,谢谢
      

  5.   

    当有客户端连接的时候,执行accept函数会返回一个SOCKET,用这个SOCKET收发数据对应的就是该客户端。多个客户端连接就会有多个SOCKET,你想与哪个客户端通讯就用哪个SOCKET。
      

  6.   


    明白了一点了,谢谢,但是还有一些不明白当有两个客户端连接上服务器端时,服务器从一个客户端a接收到数据,通过对数据的分析,将收到的数据经过处理后发送给客户端b。 此时,如何区别两个客户端? 服务器端只有一个accept函数返回的SOCKET,为client_fd,而客户端有多个,如何在服务器端区分?能以伪代码说明一下更好
      

  7.   

    侦听套接字唯一 但执行accept建立的通信套接字可以有多个(由listen确定) 用这个就可以区分不同的服务器端!
    我也在学习了!
      

  8.   

    服务器端就只有一个SOCKET在监听,如果有5个客户端连接到服务器端,服务端如何区分这5个不同的客户端呀?请高手帮助 
    ---------------------------------------
    站在服务器端的角度看,根据源IP和源端口。
      

  9.   

    对于简单的情况,你可以在accept之后,用返回的SOCKET接收数据,然后处理数据,再用这个SOCKET发送出去,然后循环回去再执行accept。如果需要持续对客户连接进行处理,可以在accept之后,创建一个线程,将返回的SOCKET作为参数传给线程,由该线程负责处理该客户连接,原线程继续循环accept。
      

  10.   


    while(1) { 
            sin_size = sizeof(struct sockaddr_in); 
            if((client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) { 
                perror("accept出错"); 
                continue; 
            } 
            printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); 
            if(!fork()) {    /* 子进程代码段 */ 
                if(send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) { 
                    perror("send出错!"); 
                } 
                close(client_fd); 
                exit(0); 
            } 
            close(client_fd); 
        } client_fd 啊,这个东西可以标识不同的客户端连接,你用一个结构来记录client_fd就可以了。
      

  11.   

    每连接一次,就会有一个新的client_fd 啊,这你还不理解。