我用 C 在套接字上撰寫服務器和客戶端。我有一個為一個客戶端運行的服務器。告訴我如何使用fork撰寫多用戶服務器。
服務器:
int main() {
int server_socket = Socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adr = {0};
adr.sin_family = AF_INET;
adr.sin_port = htons(1110);
Bind(server_socket, (struct sockaddr* )&adr, sizeof(adr));
Listen(server_socket, SOMAXCONN);
socklen_t adr_len = sizeof(adr);
int res_accept = Accept(server_socket, (struct sockaddr* ) &adr, &adr_len);
while(true) {
char buffer[1024];
ssize_t count_read = Recv(res_accept, buffer, 1024, 0);
printf("%s\n", buffer);
fflush(stdin);
char res[10];
int result = words_counter(buffer);
sprintf(res, "%d\n", result);
ssize_t count_send = Send(res_accept, res, 10, 0);
}
close(res_accept);
close(server_socket);
return 0;
}
客戶:
int main(int argc, char const *argv[]) {
int client_socket = Socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adr = {0};
adr.sin_family = AF_INET;
adr.sin_port = htons(1110);
Inet_pton(AF_INET, "127.0.0.1", &adr.sin_addr);
int res_connect = Connect(client_socket, (struct sockaddr* ) &adr, sizeof(adr));
while (true) {
char message[1024];
printf("input message\n");
fgets(message, 1024, stdin);
if (strncmp(message, "quit!", 5) == 0) break;
ssize_t count_send = Send(client_socket, message, 1024, 0);
char buffer[10];
ssize_t count_read = Recv(client_socket, buffer, 10, 0);
printf("SERVER: The number of words in the transmitted message: %s", buffer);
}
close(client_socket);
return 0;
}
我用自己撰寫的包裝功能(方便的錯誤處理)的功能,例如bind,listen等等。因此,在功能名稱用大寫字母寫的。謝謝你的幫助
uj5u.com熱心網友回復:
告訴我如何使用
fork撰寫多用戶服務器。
我帶您去詢問如何通過使用fork. 最簡單的方法是為了
從
Accept()呼叫到close(res_accept). 這提供了接受多個連接的條件。如果您只想按順序處理多個客戶端,那么這將無需任何分叉即可完成。但是,為了能夠處理多個客戶端同時,fork()接受每個連接后。讓(僅)孩子執行while回圈,然后_exit(). 相反,父級將跳過while回圈到close(res_accept). 這使父級可以接受更多連接,而子級則處理與新接受的客戶端的互動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/401892.html
上一篇:運行獨立的Django運行服務器
