#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<poll.h>
#include<unistd.h>
#include<arpa/inet.h>
int main()
{
struct pollfd fdarray[5];
int sfd,port,nsfd,n,clen,ret,i;
char buff[100];
struct sockaddr_in sadd,cadd;
memset(buff,0,sizeof(buff));
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
printf("sorry unable to open the file");
exit(1);
}
memset(&sadd,0,sizeof(sadd));
sadd.sin_port=htons(3503);
sadd.sin_family=AF_INET;
sadd.sin_addr.s_addr=INADDR_ANY;
if(bind(sfd,(struct sockaddr*) &sadd,sizeof(sadd))<0)
{
printf("errortttt");
//close(sfd);
exit(0);
}
int r;
r=listen(sfd,5);
if(r<0)
{
perror("error");
}
memset(fdarray,0,sizeof(fdarray));
fdarray[0].fd=sfd;
fdarray[0].events=POLLIN;
clen=sizeof(cadd);
int rc,nfds=1;
printf("waiting on poll\n");
while(1){
rc=poll(fdarray,nfds,-1);
if(rc<0)
{
perror("poll failed");
}
int currentsize=nfds;
for(i=0;i<currentsize;i++)
{
if(fdarray[i].revents==0)
continue;
else if(fdarray[i].fd==sfd)
{
printf("socket is reading");
nsfd=accept(sfd,NULL,NULL);
printf("new connection is established");
fdarray[nfds].fd=nsfd;
fdarray[nfds].events=POLLIN;
nfds++;
}
else
{
printf("%d",fdarray[i].fd);
recv(fdarray[i].fd,buff,sizeof(buff),0);
int j=0;
for( j=1;j<nfds;j++)
{
if(j!=i)
send(fdarray[j].fd,buff,sizeof(buff),0);
}
}
}
}
return 0;
}
私は新しいネットワークにいますこれはチャットサーバーですこれは、クライアントの1つがメッセージを送信するときに、サーバーにすべてのクライアントが接続されていると仮定するよりも、サーバーが送信しているクライアントを除くすべてのクライアントにメッセージを送信する必要があることを意味しますtcpで記述されたポーリングプログラムを使用して、udpに変換するために行われる変更と、nsfdsがないため、udpでポーリングする方法(つまり、呼び出しの受け入れを意味する)
#include "libsock"
int sfd=0;
* sender(void* dummy)
{
char buf[512];
int len=1;
int i;
while(len>0){
for(i=0;i<512;i++)
buf[i]='\0';
fgets(buf,512,stdin);
len=send(sfd,buf,strlen(buf)+1,0);
}
}
void* receiver(void* dummy)
{
int len=1;
char buf[512];
int i;
while(len>0)
{
for(i=0;i<512;i++)
buf[i]='\0';
len=recv(sfd,buf,512,0);
printf("%s",buf);
}
}
int main()
{
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
printf("socket error.\n");
return 0;
}
struct sockaddr_in serv;
serv.sin_family=AF_INET;
serv.sin_port=htons(3503);
inet_pton(AF_INET,"127.0.0.1",&serv.sin_addr);
if(connect(sfd,(struct sockaddr*)&serv,sizeof(serv))<0)
return 0;
pthread_t s,r;
pthread_create(&s,NULL,sender,NULL);
pthread_create(&r,NULL,receiver,NULL);
pthread_join(s,NULL);
return 0;
}