我试图在C中制作一个回显客户端服务器。问题是,当我启动服务器并运行客户端代码时,在客户端外壳中它会显示“已连接”,但是在服务器外壳中它仍会显示“正在等待连接” ”。 (服务器不会说“接受失败”。它会永远说“等待连接”)。我认为服务器不接受客户端,因此,如果我从客户端外壳写入任何内容,它都不会返回。
如果能得到任何帮助,我将不胜感激。
这是服务器代码:
data: {
activeIndex: null
},
methods: {
toggleActiveIndex: function(index){
this.activeIndex = index
}
}
这是客户端代码:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int socket_desc, client_sock, c, read_size;
struct sockaddr_in server, client;
char client_message[2000];
//create socket
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if(socket_desc == -1)
{
printf("Socket couldn't created\n");
}
puts("Socket created");
//prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons( 8888 );
//bind
if( bind(socket_desc,(struct sockaddr *)&server, sizeof(server)) < 0)
{
//print the error message
perror("bind failed");
return 1;
}
puts("bind done");
//Listen
listen(socket_desc , 3)
//Accept and incoming connection
puts("Waiting for incoming connections...");
c = sizeof(struct sockaddr_in);
while(1)
{
//accept connection from an incoming client
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c);
if(client_sock < 0)
{
perror("accept failed");
return 1;
}
}
puts("Connection accepted");
//Recieve message from client
while( (read_size = recv(client_sock , client_message , 2000 , 0))>0)
{
//Send the message back to client
write(client_sock , client_message , strlen(client_message));
}
if(read_size == 0)
{
puts("Client disconnected");
}
else if(read_size == -1)
{
perror("recv failed");
}
return 0;
}
答案 0 :(得分:1)
您无限循环地接受新客户。因此,即使检测到一个客户端,该代码也会等待其他客户端连接。
如果要制作一台客户端服务器,只需删除accept()
周围的循环即可。示例here
如果要创建多台客户端服务器,则可以线程接受并存储所有打开的文件描述符。示例here
答案 1 :(得分:1)
在您的服务器代码中,您永远不会离开这个无限循环:
while(1)
{
//accept connection from an incoming client
client_sock = accept(socket_desc, (struct sockaddr *)&client, (socklen_t *)&c);
if(client_sock < 0)
{
perror("accept failed");
return 1;
}
}
您应该使用fork / thread或使用select
函数。