2014-02-25 139 views
0

套接字編程實現簡單的客戶端和服務器,通過網絡進行通信並實現簡單的客戶端服務器通信。客戶端在預定義的端口上與服務器打開會話,然後提供一行文本消息。TCP套接字編程

服務器在標準輸出上輸出文本消息,並且還繼續運行以接收更多的文本消息。

當客戶端通過選擇退出選項關閉會話時,應正常終止到服務器的連接。

當通過按下控件C終止服務器時,服務器也應該正常釋放打開的套接字。

我做這個節目,但是當我輸入的字符串,然後按在客戶端輸入它不會出現在服務器上,但是當我輸入第二次在第一輸入出現,第二個是懸而未決。

第二個出現在第三輸入後...

我能得到這個問題的解決方案?

//Server.c 

int main() 
{ 
    int listenfd = 0; 
    int confd=0; 
    struct sockaddr_in sa; 
    char msg[1025]; 
char c[1]; 
     int i; 

    listenfd = socket(AF_INET,SOCK_STREAM,0); 
    if(listenfd<0) 
    { 
     perror("Socket"); 
     return 1; 
    } 
    sa.sin_family = AF_INET; 
    sa.sin_port = htons(1234); 
    sa.sin_addr.s_addr = htonl(INADDR_ANY); 

    while((bind(listenfd,(struct sockaddr*)&sa,sizeof(sa))<0)){return 1;} 
    printf("\nBind Successfull"); 

    listen(listenfd,10); 
     while(1){ 
     confd=accept(listenfd,(struct sockaddr*)NULL,NULL); 
     printf("\nConnected"); 
     memset(msg,0x0,10); 
     do{ 
       read(confd,c,1); 
       if(strcmp(c,"n")!=0) 
       { 
       read(confd,msg,10); 
       printf("\n%s",msg); 
       memset(msg,0x0,10); 
       } 
       else{ 
       confd=accept(listenfd,(struct sockaddr *)NULL,NULL); 
       printf("\nWaiting.."); 
       //close(confd); 

       } 

      // write(confd,msg,10); 
     //} 
     //msg[rc]='\0' 
     }while(1); 
     close(confd); 
    } 
} 

//Client.c 

int main() 
{ 

    int sock1= 0; 
    FILE *serv; 
    struct sockaddr_in server,clin; 
    char msg[1024],c[1]; 
    server.sin_family = AF_INET; 
    server.sin_port = htons(1234); 
    if(inet_pton(AF_INET,"192.168.125.7",&server.sin_addr)<0) 
    { 
     perror("inet_pton"); 
     return 1; 
    } 
    if((sock1 = socket(AF_INET,SOCK_STREAM,0))<0) 
    { 
     perror("socket"); 
     return 1; 
    } 
    if(connect(sock1,(struct sockaddr*)&server,sizeof(server))<0) 
    { 
     perror("Connect"); 
     return 1; 

    } 
     //printf("\nEnter 'y' to exit."); 
    while(1){ 
    // memset(&msg, '0', sizeof(msg)); 
     printf("\nDo you want to continue(y/n):"); 
     scanf(" %[^\n]",c); 
     if(strcmp(c,"y")==0){ 
       printf("\nEnter String:"); 

       scanf("%c",&c); 
       scanf(" %[^\n]",msg); 
       printf("\nSending String to server.."); 
       //scanf("%c",&c); 
       write(sock1,c,1); 
       write(sock1,msg,10); 
     } 
     if(strcmp(c,"n")==0) 
     { 
     write(sock1,c,10); 
     exit(1); 
     } 
    } 
    close(sock1); 
    printf("\n"); 
} 
+0

仔細閱讀手冊頁以獲取read()/ write(),並瞭解至少對於套接字來說,這兩個函數不一定讀取/寫入儘可能多的字節,但很少。因此,圍繞這種調用計數,直到所有數據或終結者已被讀/寫是一個好主意,而不是說必要的必要條件。 – alk

回答

0

套接字編程並不是一件容易的事情,尤其是如果你希望代碼是非阻塞的。 我建議您使用現有的代碼,而不是從頭開始編寫代碼。浪費大量時間重新發明輪子!

在這裏,您可以在演示應用程序的一個* .cpp文件中找到線程安全的C++ Socket類,它可以顯示雙向發送和接收字符串的熱度,甚至可以使用演示應用程序連接到Telnet服務器等等...

http://www.codeproject.com/Articles/34163/A-Universal-TCP-Socket-Class-for-Non-blocking-Serv

該代碼被批准,因爲幾年沒有任何問題的工作。我用它在商業產品中,並可以向你保證它是防彈的。