【问题标题】:send() not sending data to clients, socket programmingsend() 不向客户端发送数据,套接字编程
【发布时间】:2013-09-22 15:20:04
【问题描述】:

我正在尝试创建一个连接到多个客户端的服务器。基本上,我不想在有人新连接到服务器时向所有客户端发送提示。但是,send() 命令并没有发送数据。:( 不知道代码有什么问题。

int main(int argc, char **argv){
int listenfd,connfd;
struct sockaddr_in servaddr,cliaddr;
socklen_t len = sizeof(cliaddr);
char cli_ip[32];
char mesg[1024];
char broadcast[500];
int maxconn,counter = 0;
//  struct addrinfo hints, *ai, *p;

socklen_t addrlen;
fd_set master;
fd_set read_fds;
int fdmax;
int yes = 1;
int i, j;
char  remoteIP[INET6_ADDRSTRLEN];

FD_ZERO(&master);
FD_ZERO(&read_fds);
listenfd = socket(PF_INET,SOCK_STREAM,0);

bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(54321);
setsockopt(listenfd, SOL_SOCKET,SO_REUSEADDR, &yes, sizeof(int));

if(bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0 ){
    perror(NULL);
    exit(1);
}
maxconn = 2;
if((listen(listenfd,5)) == -1){
    perror("listen");
    exit(2);
}
FD_SET(listenfd, &master);
fdmax = listenfd;
while(1){
    read_fds = master;
    if((select(fdmax + 1,&read_fds, NULL, NULL, NULL )) == -1){
        perror("select");
        exit(3);
    }
    for(i = 0; i <= fdmax; i++){
        if(FD_ISSET(i, &master)){
            if(i = listenfd){
                if(counter<= maxconn){
                    addrlen = sizeof(cliaddr);
                    connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &addrlen);
                    counter++;
                    inet_ntop(AF_INET,(struct in_addr *)&cliaddr.sin_addr, cli_ip, sizeof(cli_ip));
                    if(connfd == -1){
                        perror("accept");
                        exit(4);
                    }else{
                        FD_SET(connfd, &master);
                        if(connfd > fdmax)
                            fdmax = connfd;
                        sprintf(broadcast,"Player %d from %s has connected.\n",connfd, cli_ip);
                        for(j = i+ 1; j <= connfd; j++){
                            if(FD_ISSET(j, &master)){
/*somehow this doesn't work :(*/    if((send(j, broadcast, sizeof(broadcast), 0))){
                                    perror("send");
                                    exit(5);
                                }
                            }
                        }
                        printf("%s,%d\n",broadcast,counter);
                        printf("%d,%d\n",i,fdmax);
                        break;
                    }
                }else{
                    printf("server full\n");
                    close(connfd);
                    break;
                }
            }
        }
    }
}

return 0;
} 

如您所见,此代码与 Beej 指南中的代码有点相似。那么为什么客户端没有收到广播呢?

【问题讨论】:

  • 错误信息是什么?
  • 没有错误消息,客户端不只是打印“播放器...来自...已连接”。所以我推断即使我测试过并且代码进入了“for”循环,服务器也一定不会以某种方式发送数据。

标签: c sockets client send


【解决方案1】:

我不知道这是否是您的确切问题,但这不会像您预期的那样工作。

if ((send(j,  broadcast,  sizeof(broadcast),  0)))
{
    perror("send");
    exit(5);
}

send 将返回发送的字节数或 -1 错误,这将评估为 true 为 0 以外的任何内容,因此您至少应该看到 perror 的输出,即使它误导,因为它只是 errno 中的一些随机值,因为 send 实际上并没有失败,然后是程序终止。

而且您不想发送sizeof(broadcast),这将是整个 500 字节,其中大部分是随机垃圾,但 strlen(broadcast)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 2012-05-21
    • 2018-05-16
    相关资源
    最近更新 更多