2013-02-27 20 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中編寫的poll程序完成此操作。爲了轉換爲udp以及如何在udp中進行輪詢,將做出哪些更改?沒有nsfds ie意味着接受電話什麼都是爲了TCP progrem轉換成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; 
} 
+2

顯示你所嘗試過的。您不能轉儲兩個非縮進代碼清單並說「修復此問題」,這看起來像什麼。 – CodeCaster 2013-02-27 19:33:31

+1

關於將會計應用程序轉換爲遊戲的相同數量的更改。 – 2013-02-27 19:36:03

+0

縮進是必需的! – 2013-02-27 19:36:25

回答

1

如果你只是想發送單個數據包沒有通常的保證TCP給你,那麼你可以改變你的p rograms into simple recvfrom-client/server這部分對於每個操作系統都非常相似),這裏是more info。如果你想要這些保證,(1)你的數據包以正確的順序到達所有(2)並且(3)未損壞,那麼你將不得不自己重新實現TCP。 (這有時是爲了遊戲而完成的,因爲他們通常不關心舊數據)您將不得不讓客戶端和服務器重新發送丟失/損壞的包。所以軟件包必須進行編號和校驗和,但棘手的部分是決定每個應該緩衝數據的時間。

+0

棘手的部分是所有這一切,尤其是你遺漏的:窗口化,慢啓動,指數退避,RTT估計,擁塞避免,... – EJP 2013-02-28 07:36:14

+0

@EJP絕對,我只告訴最低限度,因爲OP是聯網新手。 – 2013-02-28 10:28:25