gpt4 book ai didi

c - send() 不向客户端发送数据,套接字编程

转载 作者:行者123 更新时间:2023-11-30 17:47:41 25 4
gpt4 key购买 nike

我正在尝试创建一个连接到多个客户端的服务器。基本上,我不想做的是每当有新人连接到服务器时向所有客户端发送提示。但是,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 指南中的代码有点相似。那么为什么客户端收不到广播呢?

最佳答案

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

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

send将返回发送的字节数或 -1(出错时),并且对于除 0 之外的任何值都将计算为 true,因此您至少应该看到 perror 的输出即使它具有误导性,因为它只是 errno 中的一些随机值,因为 send实际上并没有失败,随后程序终止。

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

关于c - send() 不向客户端发送数据,套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com