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;
}

私は新しいネットワークにいますこれはチャットサーバーですこれは、クライアントの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;
}
4

1 に答える 1

1

TCPが提供する通常の保証なしで単一のパケットを送信したい場合は、プログラムを単純なrecvfrom -client / serverに変更できます(この部分はすべてのOSで非常に似ています)。詳細はこちらをご覧ください

ただし、これらの保証が必要な場合は、(1)パケットがすべて(2)正しい順序で到着し、(3)損傷を受けていないことを保証する場合は、TCPを自分で効果的に再実装する必要があります。(ゲームでは古いデータを気にしないことが多いため、これが行われることがあります)紛失/破損したパッケージをクライアントとサーバーの両方に再送信させる必要があります。したがって、パッケージには番号を付けてチェックサムを付ける必要がありますが、注意が必要なのは、各パッケージがデータをバッファリングする期間を決定することです。

于 2013-02-27T20:24:59.707 に答える