【发布时间】:2023-04-24 07:47:02
【问题描述】:
我有这个 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 在程序(开始字符串))。 在终端中只有闪烁的白色字符
我不明白为什么。 我在 Mac 和 Linux 上测试过
【问题讨论】:
-
尝试在
printf("START");之后使用fflush(stdout);来打印字符串。 -
是的,现在它可以工作了,但好奇:我试图删除所有程序,我只留下了 Printf“开始”并且它工作,而不是如果我添加所有程序它不起作用。为什么?
-
@ginogino 缓冲的输出在程序退出时被刷新。