2013-02-27 3 views
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, каковы изменения, которые необходимо внести для преобразования в udp и как опросить в udp, поскольку есть нет nsfds то значит принять звоноккакие изменения должны быть сделаны для того, чтобы преобразовать TCP progrem в УДП

#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; 
} 
+2

Показать, что вы пробовали. Вы не можете сбросить два неперечисленных списков кода и сказать «исправить это», как это выглядит. – CodeCaster

+1

О том же количестве изменений, чтобы конвертировать бухгалтерское приложение в игру. – 2013-02-27 19:36:03

+0

Отступ требуется! –

ответ

1

Если вы просто хотите отправить одиночные пакеты без обычных гарантий TCP дает вам, то вы можете просто изменить свой р rograms to simple recvfrom-client/server (эта часть очень похожа на каждую ОС), вот more info.

BUT, если вы хотите получить эти гарантии, (1), что ваши пакеты поступают на все (2) в правильном порядке и (3) неповрежденными, то вам действительно придется повторно реализовать TCP самостоятельно. (Это иногда делается для игр, потому что они часто не заботятся о старых данных). Вам придется сделать как клиентские, так и серверные пакеты пересылки, которые были потеряны/повреждены. Таким образом, пакеты должны быть пронумерованы и проверены, но сложная часть заключается в определении того, как долго каждый из них должен буферизовать данные.

+0

Сложная часть - все это, особенно то, что вы оставили: окно, медленный старт, экспоненциальный откат, оценка RTT, предотвращение перегрузок, ... – EJP

+0

@EJP абсолютно, я сказал только минимум, потому что OP новичок в сети. –

Смежные вопросы