#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;
}
我是新网络这是聊天服务器,这意味着当客户端之一发送消息时,假设有10个客户端都连接到服务器,服务器应该将消息发送给除发送客户端之外的所有客户端我用tcp编写的poll程序完成了这个,为了转换成udp会有什么变化,以及如何在udp中进行轮询,因为没有nsfds即意味着接受调用
#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;
}
答案 0 :(得分:1)
如果您只想发送单个数据包而没有TCP提供的通常保证,那么您可以将程序更改为简单的recvfrom-client/server(此部分对于每个操作系统非常相似),这是more info。
但是如果你想要这些保证,(1)你的数据包以正确的顺序到达所有(2)并且(3)没有损坏,那么你将有效地重新实现TCP 。 (这有时是针对游戏进行的,因为他们通常不关心旧数据)您必须使客户端和服务器重新发送丢失/损坏的包。因此,包必须进行编号和校验和,但棘手的部分是决定每个包应该缓冲数据的时间。