![](/img/trans.png)
[英]C Socket Programming Server sending the same message to multiple clients
[英]send() not sending data to clients, socket programming
我正在嘗試創建連接到多個客戶端的服務器。 基本上,我不希望的是每當新用戶連接到服務器時向所有客戶端發送提示。 但是,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)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.