2011-11-19 183 views
5

我開始閱讀和了解「套接字」,但我在尋找用C語言編寫的客戶端和服務器,這將是一個小代碼樣本無阻塞非阻塞的客戶端和服務器套接字用C

代碼應該能夠從客戶端發送輸入,並且服務器必須能夠接收處於非阻塞狀態的輸出,兩者都應處於非阻塞狀態。

我在谷歌和書籍,YouTube上看過很多,但沒有什麼幫助。

這是我的服務器:

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <errno.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    int sock; 
    int addr_len, bytes_read; 
    char recv_data[1024]; 
    struct sockaddr_in server_addr , client_addr; 


    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { 
     perror("Socket"); 
     exit(1); 
    } 

    server_addr.sin_family = AF_INET; 
    server_addr.sin_port = htons(5000); 

    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

    bzero(&(server_addr.sin_zero),8); 


    if (bind(sock,(struct sockaddr *)&server_addr, 
      sizeof(struct sockaddr)) == -1) 
    { 
     perror("Bind"); 
     exit(1); 
    } 

    addr_len = sizeof(struct sockaddr); 

    printf("\nUDPServer Waiting for client on port 5000"); 
    fflush(stdout); 

    while (1) 
    { 

     bytes_read = recvfrom(sock,recv_data,1024,0, (struct sockaddr *)&client_addr, &addr_len); // <---- Here is the problem 


     recv_data[bytes_read] = '\0'; 

     printf("\n(%s , %d) said : ",inet_ntoa(client_addr.sin_addr), 
       ntohs(client_addr.sin_port)); 
     printf("%s", recv_data); 
     fflush(stdout); 

    } 
    return 0; 
} 

回答

9

我覺得你問如何非阻塞套接字上執行I/O。 Beej's guide已經存在很長時間了;它涵蓋了所有這些和更多,以及良好的代碼示例。

+1

你好佈雷特 - 我使用了Beej的指南,但沒有得到它..請幫助我與考試,而不是.. – user1022734

+1

Beej的指導是非常明確的,它有你想要實現的示例程序。看看指南的第7章。第一個代碼是客戶端,第二個代碼是服務器。 – steve

6

非阻塞I/O的想法是能夠處理多個套接字而不訴諸多個線程。這裏的中心部分是I/O de-multiplexing,即呼叫select(2)poll(2)(或平臺特定功能,如epoll(7)kqueue(2))。

這是一個簡短的introduction

+0

我如何影響我的服務器中的「select()」? – user1022734

+0

您的循環在'select()'中等待,然後檢查任何已註冊的套接字是否可讀(在內部循環中),然後從每個活動套接字讀取。 –

+0

代碼請教,我的英文不好 – user1022734