C客户端/服务器问题

时间:2015-12-24 00:40:05

标签: c linux terminal server

我有这个C服务器:

#define TRUE  1
#define FALSE 0
#define BUFSIZE 256
#define SERVER_PORT 8887

int main ( int argc, char *argv[])
{
    signal(SIGCHLD, SIG_IGN);

    printf("START");

    int ls;  // listen socket
    int s; // socket descriptor 
    int n; // byte send / receive 
    int waitSize; // queue's length 

    struct sockaddr_in serverAddr;
    struct sockaddr_in clientAddr;

    int clientAddrLen = sizeof( clientAddr );

    memset(&serverAddr,0,sizeof(serverAddr));

    serverAddr.sin_family=AF_INET;
    serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    serverAddr.sin_port=htons(SERVER_PORT);

    if( (ls = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("Error: socket creation");
        exit(1);
    }

    int so_reuseaddr = TRUE;
    if(setsockopt(ls,SOL_SOCKET,SO_REUSEADDR, &so_reuseaddr, sizeof(so_reuseaddr))<0)
    {
        perror("Error: general");
        exit(1);
    }

    if(bind(ls, (struct sockaddr *) &serverAddr, sizeof(serverAddr))<0)
    {
        perror("Error: bind error");
        exit(1);
    }

    if(listen(ls,waitSize)<0)
    {
        perror("Error: listen operation");
        exit(1);
    }

    while(1)
    {
        if ((s=accept(ls,(struct sockaddr*) &clientAddr, &clientAddrLen))<0)
        {
            perror("Error: accepting error");
            exit(1);
        }

        if( fork() == 0)
        {
            while(1)
            {
                char cmd[BUFSIZE];
                char var1[BUFSIZE];
                char var2[BUFSIZE];
                char string[100];

                memset(cmd, 0, sizeof(cmd));
                memset(var1, 0, sizeof(var1));
                memset(var2, 0, sizeof(var2));
                memset(string, 0, sizeof(string));

                if( readLine(s, cmd, sizeof(cmd)) == 0)
                {
                    exit(0);
                }
                if( readLine(s, var1, sizeof(var1)) == 0)
                {
                    exit(0);
                }
                if( readLine(s, var2, sizeof(var2)) == 0)
                {
                    exit(0);
                }

                removeNewLine(cmd);
                removeNewLine(var1);
                removeNewLine(var2);


                if( strcmp(cmd, "somma") == 0)
                    sprintf(string, "%d\n", atoi(var1) + atoi(var2));
                else if ( strcmp( cmd, "diversi") == 0 )
                    if( strcmp( var1, var2) != 0) 
                        sprintf(string,"The strings %s e %s are not equals\n", var1, var2);
                    else sprintf(string,"test fals\n");

                printf("%s", string);
                writeLine(s, string, strlen(string));
            }
        }
        else
        {
            close(s);
        }
    }


    close(s);
    exit(0);
}

服务器代码中使用的函数:

int readLine( int fd, char* str, int bufferSize)
    {
        return readToDel(fd, '\n', str, bufferSize);
    }
int readToDel( int fd, char delimiter, char* str, int bufferSize)
{
    int n;
    int byteLetti =0;
    int index=0;



    do /* Read characters until NULL or end-of-input */
    {

        if( (n = read (fd, str+index, 1)) < 0)
        {
            perror("Errore: lettura dal file descriptor fallita");
            exit(1);
        }
        byteLetti+=n;

    }
    while (n > 0 && *(str+index++) != delimiter && index < bufferSize);


    return byteLetti; /* Return false if end-of-input */
}

void removeNewLine( char *s )
{
    removeDel(s, "\r\n");
}

void removeDel( char *s, char *del)
{
    s[strcspn ( s, del )] = '\0';
}

我的问题是,当我通过终端执行此程序时(我收到一些警告,但我认为这并不重要)这个程序就好像没有开始(我没有看到程序中的第一个printf(START字符串))。 在终端只有白色字符闪烁

我不明白为什么。 我在Mac和Linux上测试过它

1 个答案:

答案 0 :(得分:0)

您的stdout正在缓冲,因为打印字符串末尾没有\n