我遇到了一个奇怪的情况。我正在创建一个简单的回显客户端服务器。客户端能够向服务器发送消息。 accept
调用在服务器中成功,但由于某种原因,它第一次没有检测到客户端消息。但是当客户端第二次发送消息时,服务器能够检测到该消息并打印它。
这是我接受客户端连接的服务器片段。
while(1) {
// continuously listen for the new client-requests
int client_fd = accept(server_fd, (struct sockaddr*)&client,&client_socklen);
if(client_fd > 0) {
char b[10];
while(1) {
ssize_t response = recv(client_fd,b, 10, 0);
if(response == 0) {printf("reached end of stream"); break;}
if(response == -1) {printf("error"); break;}
}
fprintf("%s", b);
}
}
当客户端第一次发送请求时,对 accept
的调用成功,控件进入 if
block ,但在那里它没有接收消息,只是打印 到达流末尾
。但是当客户端再次发送消息时,它会收到消息并打印出来。为什么会出现这种情况?客户端正在发送一条简单的 echo!
消息。
客户端片段:
#include <netdb.h>
#include <netinet/in.h>
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#define SERVER_ADDR "localhost"
#define SERVER_PORT 8889
int main(int argc, char **argv) {
int socket_fd = 0;
struct sockaddr_in server_socket_addr;
// Converts localhost into 0.0.0.0
struct hostent *he = gethostbyname(SERVER_ADDR);
unsigned long server_addr_nbo = *(unsigned long *)(he->h_addr_list[0]);
// Create socket (IPv4, stream-based, protocol likely set to TCP)
if (0 > (socket_fd = socket(AF_INET, SOCK_STREAM, 0))) {
fprintf(stderr, "client failed to create socket\n");
exit(1);
}
bzero(&server_socket_addr, sizeof(server_socket_addr));
server_socket_addr.sin_family = AF_INET;
server_socket_addr.sin_port = htons(SERVER_PORT);
server_socket_addr.sin_addr.s_addr = server_addr_nbo;
// Connect socket to server
if (0 > connect(socket_fd, (struct sockaddr *)&server_socket_addr, sizeof(server_socket_addr))) {
fprintf(stderr, "client failed to connect to %s:%d!\n", SERVER_ADDR, SERVER_PORT);
close(socket_fd);
// exit(1);
} else {
fprintf(stdout, "client connected to to %s:%d!\n", SERVER_ADDR, SERVER_PORT);
char *my_message = "hey!!"
int bytes_sent = send(socket_fd, my_message, strlen(my_message), 0);
}
// Close the socket and return
close(socket_fd);
return 0;
}
最佳答案
而不是这个:
if(client_fd > 0) {
char b[10];
while(1) {
ssize_t response = recv(client_fd,b, 10, 0);
if(response == 0) {printf("reached end of stream"); break;}
if(response == -1) {printf("error"); break;}
}
fprintf("%s", b);
这个:
if(client_fd > 0) {
const size_t BUFFER_SIZE = 10;
char b[BUFFER_SIZE+1]; // +1 for null termination
while(1) {
b[0] = '\0';
ssize_t response = recv(client_fd,b, BUFFER_SIZE, 0);
if(response == 0) {printf("reached end of stream"); break;}
if(response == -1) {printf("error"); break;}
b[response] = '\0';
printf("%s\n", b); // \n so that the message will flush to the console
}
关于c - 服务器套接字第一次没有收到消息。为什么会出现这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59747115/