我做了一個簡單的服務器客戶端程式,select()但問題是客戶端沒有收到歡迎訊息。我早些時候做了幾次select(),但它確實有效,但突然之間它不想在使用select(). 我究竟做錯了什么?
服務器:
#define MAX_CLIENTS 10
int main()
{
system("clear");
printf("***SERVER STARTED***\n");
int master_socket = socket(AF_INET, SOCK_STREAM, 0);
fd_set fdsForReading;
struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8888);
bind(master_socket, (struct sockaddr *)&address, sizeof(address));
listen(master_socket, 3);
while (1)
{
FD_ZERO(&fdsForReading); // Clearing the file descriptor set
FD_SET(master_socket, &fdsForReading); // Add master_socket to file descriptor set
printf("Monitoring for connections...\n");
select(master_socket 1, &fdsForReading, NULL, NULL, NULL);
int accepted_socket = accept(master_socket, (struct sockaddr *)&address, sizeof(address));
printf("[ ] New connection accepted\n");
char buffer[125] = "Welcome to my server";
send(accepted_socket, buffer, sizeof(buffer), 0);
printf("End of while loop\n");
}
}
客戶:
int main()
{
system("clear");
int clientSocket = socket(AF_INET, SOCK_STREAM, 0), x;
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_port = htons(8888);
serverAddress.sin_addr.s_addr = INADDR_ANY;
connect(clientSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress));
char serverResponse[125];
recv(clientSocket, &serverResponse, sizeof(serverResponse), 0);
printf("test: %s\n", serverResponse);
scanf("%d", &x);
close(clientSocket);
}
uj5u.com熱心網友回復:
- 你不檢查錯誤。總是這樣!
&serverResponse應該serverResponserecv收到的字符數可能少于發送的字符數,因此您應該檢查收到的字符數,并可能連接收到的字符數,直到收到完整的訊息。- 您收到的內容通常不會以空字符結尾,因此您需要添加
\0是否將收到的內容與printf("%s", ...需要空字符結尾的字串的函式一起使用。在您的情況下,您實際上發送125chars 即使字串要短得多。你可能不應該這樣做。這將發送字串 空終止字符:send(accepted_socket, buffer, strlen(buffer) 1, 0); - to 的第三個引數
accept應該是 asocklen_t *-notsizeof(address)。例子:socklen_t addrlen = sizeof address; int accepted_socket = accept(master_socket, (struct sockaddr *)&address, &addrlen);
通過這些更改,如果沒有發生錯誤,客戶端將收到良好的問候語 - 但是當您添加錯誤檢查時,您將看到這種情況下的問題所在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/373207.html
下一篇:無法讀取c中的arp資料包
