0
#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;
}
4

1 回答 1

1

如果您只想发送单个数据包而没有 TCP 为您提供的通常保证,那么您可以将您的程序更改为简单的recvfrom -client/server这部分对于每个操作系统都非常相似),这里有更多信息

但是,如果您想要这些保证,(1)您的数据包完全到达(2)以正确的顺序和(3)未损坏,那么您将不得不自己重新实现 TCP。(这有时用于游戏,因为它们通常不关心旧数据)您将不得不让客户端和服务器重新发送丢失/损坏的包。所以必须对包进行编号和校验和,但棘手的部分是决定每个包应该缓冲数据多长时间。

于 2013-02-27T20:24:59.707 回答