我有这个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上测试过它
答案 0 :(得分:0)
您的stdout正在缓冲,因为打印字符串末尾没有\n
。