服务器没有为每个新客户端(套接字)分配线程

时间:2016-03-30 07:25:14

标签: c multithreading sockets

我使用套接字创建了一个小型程序服务器客户端。我将解释它需要做什么,然后解决错误。

应用程序有一个服务器等待客户端。它同时支持最多6个客户端。对于每个客户端服务器,在DETASH_STATE中启动一个线程,然后它返回并监听。

客户端会将文件的上下文提交给服务器。 (我选择逐行发送)

服务器将接收客户端发送的内容并将其保存到文件中,其名称如下:__ ft _"任意随机字符串" .txt

我希望到目前为止一切都很清楚。

错误: 好吧,如果我启动客户端,请说20次。在服务器端,我没有20个文件。有时我有10,有时12,5,7(不可预测)。它在一个文件中写入3或4或5个客户端发送的内容(这里我需要3-4-5个文件)。我不知道这个错误或我做错了什么。如果您需要其他信息,请告诉我。

这是服务器代码(其中的一部分):

#include <stdio.h>
#include <stdlib.h>
#include<netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>




int main(int argc, char *argv[])
{
/***************CHECKING THE ARGUMENT*************/
if (argc < 2)
{
   printf("Usage: %s hostname\n", argv[0]);
   return 1;
}
/*************************************************/

int sock_dest;
struct sockaddr_in server_addr;
char line[300];

/******************CREATE SOCKET*****************/

sock_dest = socket(AF_INET, SOCK_STREAM, 0);
if(sock_dest == -1)
{
   printf("Couldn't create socket.\n");
   return 1;
}

struct hostent *server;
server = gethostbyname(argv[1]);

if (server == NULL)
{
    printf("ERROR, no such host\n");
    return 1;
}

/***** SETTING FIELDS OF SERVER SOCKADDR_IN STRUCTURE *****/

bzero((char *) &server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,(char *)&server_addr.sin_addr.s_addr,server->h_length);
server_addr.sin_port = htons ( 31000 );

/**********************************************************/

/*********TRYING TO CONNECT TO THE SERVER******************/


if (connect(sock_dest,(struct sockaddr *) &server_addr,sizeof(server_addr)) < 0)
{
    printf("ERROR:(Can't connect to the server. Please check if it's online)\n");
    return 1;
}

/***********************************************************/

char path_read[200];
int read_len,n;
FILE *f_read;
char *exit_signal = "\nEXIT\0";
if((f_read=fopen("test.txt","r"))==NULL)
{
    printf("Failed to open path.txt.\n");
    return 0;
}
while((fgets(path_read,200,f_read))!=NULL)
{
    path_read[strlen(path_read)+1]='\n';
    n = write(sock_dest,path_read,strlen(path_read));
    if(n<0)
        error("ERROR writing to socket");
    bzero(path_read,200);
}

n=write(sock_dest,exit_signal,strlen(exit_signal));
fclose(f_read);
close(sock_dest);
printf("All lines in the file were sent to the server.\nExiting...\n");

return 0;
}

这是客户端代码(我不认为这是问题):

{{1}}

1 个答案:

答案 0 :(得分:1)

这是一个错误:

(void*) &client_socket

首先,无需转发void*。其次,看起来client_socket是一个局部变量,你将地址作为上下文传递给线程。在起始线程中,然后继续使用下一次迭代覆盖其值。