C 两个客户端套接字程序中的第二个连接很少不被服务器接受
我是套接字编程新手,如果这是一个noob问题,我很抱歉。C 两个客户端套接字程序中的第二个连接很少不被服务器接受,c,function,sockets,parameters,C,Function,Sockets,Parameters,我是套接字编程新手,如果这是一个noob问题,我很抱歉。 我有一个C for Linux的程序,它在fork()的帮助下将两个套接字从“server.C”连接到两个“client.C”。它在大多数情况下工作正常,但有时第二个客户机在第一个recv()函数之前卡住。在这些情况下,服务器不接受()连接,我对真正发生的事情以及如何修复它感到困惑。 由于我对套接字编程了解不多,任何解释都可能有用。 以下是服务器和客户端的代码: 服务器.c int main(){ int server_soc
我有一个C for Linux的程序,它在fork()的帮助下将两个套接字从“server.C”连接到两个“client.C”。它在大多数情况下工作正常,但有时第二个客户机在第一个recv()函数之前卡住。在这些情况下,服务器不接受()连接,我对真正发生的事情以及如何修复它感到困惑。
由于我对套接字编程了解不多,任何解释都可能有用。
以下是服务器和客户端的代码: 服务器.c
int main(){
int server_socket, p1_socket, p2_socket;
int pid;
pid = fork();
if(pid<0)
printf("Fork failed.\n");
else if(pid==0){
//PLAYER 1
socket_creation_and_connection(&server_socket, &p1_socket);
connect_to_player(&p1_socket, 1);
}
else{
//PLAYER 2
socket_creation_and_connection(&server_socket, &p2_socket);
connect_to_player(&p2_socket, 2);
}
printf("Hello message sent from %d\n", pid);
return 0;
}
void connect_to_player(int *socket, int playerNo){
char buffer[256];
while(1){
send(*socket , (int *)&playerNo , sizeof(int) , 0);
recv(*socket, (int *)&buffer, 1024, 0);
printf("PlayerNo %d Message received from client %s\n", playerNo, buffer);
}
}
void socket_creation_and_connection (int *server_socket, int *new_socket){
struct sockaddr_in address;
int addrlen = sizeof(address);
printf("creating sth\n");
if ((*server_socket = socket(AF_INET, SOCK_STREAM, 0)) == 0){
perror("Failed to create socket.");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
if (bind(*server_socket, (struct sockaddr *)&address, sizeof(address))<0){
perror("Failed to bind.");
exit(EXIT_FAILURE);
}
if (listen(*server_socket, 3)<0){
perror("Failed to listen.");
exit(EXIT_FAILURE);
}
if ((*new_socket = accept(*server_socket, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0){
perror("Failed to accept.");
exit(EXIT_FAILURE);
}
printf("finished creating sth\n");
}
我不熟悉fork,但是通过这样做,您是否尝试在同一端口上的两个不同上下文中接受连接?这不应该奏效。您不需要fork-accept,您只需循环except,每次接收到连接时,您可能会在每个套接字上创建一个读取线程?理想情况下,情况并非如此,如果您在GNU/Linux上,您应该使用epoll/select。这将是一个客户端需要通过服务器相互通信的游戏,到目前为止,它使用的是fork()。我还没有尝试过你的想法,因为我不熟悉线程,但是在我找不到如何解决这个问题的情况下,我将尝试实现它们。我将为你编写一个示例代码。
int main(){
int client_socket = 0;
char message[256];
socket_creation_and_connection(&client_socket);
int intbuf;
while(1){
recv(client_socket, (int *)&intbuf, sizeof(int), 0);
if(intbuf == 1)
printf("Received message from Player1\n");
else
printf("Received message from Player2\n");
printf("Type a string\n");
scanf("%s", message);
send(client_socket, message , strlen(message) , 0 );
sleep(1);
}
return 0;
}
void socket_creation_and_connection(int *client_socket){
struct sockaddr_in address;
if ((*client_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Socket creation error \n");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_port = htons(PORT);
if (connect(*client_socket, (struct sockaddr *)&address, sizeof(address)) < 0)
{
printf("Connection Failed.\n");
exit(EXIT_FAILURE);
}
}
#define PORT 8080