linux qt fd socket,linux socket的select函数例子

#include#include#include#include#include#include#include#include#include#defineMYPORT 1234//the port users will be connecting to#defineBACKLOG 5//how many pending connections queue will hold#defineBUF_SIZE 200intfd_A[BACKLOG];//accepted connection fdintconn_amount;//current connection amountvoidshowclient()

{inti;

printf("client amount: %d\n", conn_amount);for(i=0; i

printf("[%d]:%d", i, fd_A[i]);

}

printf("\n\n");

}intmain(void)

{intsock_fd, new_fd;//listen on sock_fd, new connection on new_fdstructsockaddr_in server_addr;//server address informationstructsockaddr_in client_addr;//connector's address informationsocklen_t sin_size;intyes=1;charbuf[BUF_SIZE];intret;inti;if((sock_fd=socket(AF_INET, SOCK_STREAM,0))==-1) {

perror("socket");

exit(1);

}if(setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR,&yes,sizeof(int))==-1) {

perror("setsockopt");

exit(1);

}

server_addr.sin_family=AF_INET;//host byte orderserver_addr.sin_port=htons(MYPORT);//short, network byte orderserver_addr.sin_addr.s_addr=INADDR_ANY;//automatically fill with my IPmemset(server_addr.sin_zero,'\0',sizeof(server_addr.sin_zero));if(bind(sock_fd, (structsockaddr*)&server_addr,sizeof(server_addr))==-1) {

perror("bind");

exit(1);

}if(listen(sock_fd, BACKLOG)==-1) {

perror("listen");

exit(1);

}

printf("listen port %d\n", MYPORT);

fd_set fdsr;intmaxsock;structtimeval tv;

conn_amount=0;

sin_size=sizeof(client_addr);

maxsock=sock_fd;while(1) {//initialize file descriptor setFD_ZERO(&fdsr);

FD_SET(sock_fd,&fdsr);//timeout settingtv.tv_sec=30;

tv.tv_usec=0;//add active connection to fd setfor(i=0; i

FD_SET(fd_A[i],&fdsr);

}

}

ret=select(maxsock+1,&fdsr, NULL, NULL,&tv);if(ret<0) {

perror("select");break;

}elseif(ret==0) {

printf("timeout\n");continue;

}//check every fd in the setfor(i=0; i

ret=recv(fd_A[i], buf,sizeof(buf),0);if(ret<=0) {//client closeprintf("client[%d] close\n", i);

close(fd_A[i]);

FD_CLR(fd_A[i],&fdsr);

fd_A[i]=0;

}else{//receive dataif(ret

memset(&buf[ret],'\0',1);

printf("client[%d] send:%s\n", i, buf);

}

}

}//check whether a new connection comesif(FD_ISSET(sock_fd,&fdsr)) {

new_fd=accept(sock_fd, (structsockaddr*)&client_addr,&sin_size);if(new_fd<=0) {

perror("accept");continue;

}//add to fd queueif(conn_amount

fd_A[conn_amount++]=new_fd;

printf("new connection client[%d] %s:%d\n", conn_amount,

inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));if(new_fd>maxsock)

maxsock=new_fd;

}else{

printf("max connections arrive, exit\n");

send(new_fd,"bye",4,0);

close(new_fd);break;

}

}

showclient();

}//close other connectionsfor(i=0; i

close(fd_A[i]);

}

}

exit(0);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 平台下,使用原生 socket 实现组播需要以下步骤: 1. 创建一个 socket,使用 socket() 函数。 2. 设置 socket 的属性,包括地址重用、TTL 等。 3. 绑定 socket 到本地地址和端口号,使用 bind() 函数。 4. 加入一个组播组,使用 setsockopt() 函数,传入 IP_ADD_MEMBERSHIP 参数,指定组播地址和本地接口地址。 5. 使用 sendto() 函数发送数据。 6. 在数据接收端,使用 bind() 函数绑定到组播地址和端口号,然后使用 recvfrom() 函数接收数据。 下面是一个简单的示例代码: ```cpp // 创建 socket int sock = socket(AF_INET, SOCK_DGRAM, 0); // 设置 socket 属性 int reuse = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)); int ttl = 64; setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)); // 绑定到本地地址和端口号 struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(1234); bind(sock, (struct sockaddr *)&addr, sizeof(addr)); // 加入组播组 struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); mreq.imr_interface.s_addr = htonl(INADDR_ANY); setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); // 发送数据 const char *data = "Hello, multicast!"; struct sockaddr_in dest; memset(&dest, 0, sizeof(dest)); dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr("224.0.0.1"); dest.sin_port = htons(1234); sendto(sock, data, strlen(data), 0, (struct sockaddr *)&dest, sizeof(dest)); // 接收数据 char buf[1024]; struct sockaddr_in src; socklen_t srclen = sizeof(src); recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&src, &srclen); printf("Received multicast data: %s\n", buf); ``` 在这个示例中,我们创建了一个 socket,并设置了 socket 属性,包括地址重用和 TTL。然后绑定到本地地址和端口号,并加入了组播组 224.0.0.1。使用 sendto() 函数发送了一条数据。最后,在接收端使用 recvfrom() 函数接收数据,并打印出来。 需要注意的是,组播地址是一个特殊的地址,不能被分配给单个主机。组播地址范围为 224.0.0.0 ~ 239.255.255.255,其中 224.0.0.0 ~ 224.0.0.255 是本地链路组播地址,只能在本地网络内使用。在加入组播组时,需要指定组播地址和本地接口地址。可以使用 INADDR_ANY 表示任意本地接口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值