【发布时间】:2014-10-07 15:25:48
【问题描述】:
我正在 Ubuntu 上用 C 语言创建服务器,但是我遇到了一个 printf 函数不起作用的问题。这是代码。我希望终端在程序启动后立即打印“dd”,但它什么也不做。有什么建议吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
void main(){
printf("dd");
int ds_sock;
struct sockaddr_in my_addr;
ds_sock=socket(AF_INET,SOCK_STREAM,0);
memset(&my_addr,0,sizeof(my_addr));
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(25000);
my_addr.sin_addr.s_addr=INADDR_ANY;
bind(ds_sock,(struct sockaddr *)&my_addr,sizeof(my_addr));
listen(ds_sock,3);
printf("dd");
int ds_sock_acc;
struct sockaddr_in addr;
size_t sin_size = sizeof(struct sockaddr_in);
ds_sock_acc = accept(ds_sock,(struct sockaddr *)&addr,&sin_size);
while(ds_sock_acc==-1) {
printf("connessione non riuscita");
ds_sock_acc = accept(ds_sock,(struct sockaddr *)&addr,&sin_size);
}
printf("connessione riuscita");
close(ds_sock);
close(ds_sock_acc);
}
此(客户端)按预期工作:
void main(){
printf("dd");
int ds_sock;
ds_sock = socket(AF_INET, SOCK_STREAM,0);
int ret;
struct sockaddr_in Eaddr;
Eaddr.sin_family = AF_INET;
Eaddr.sin_port = htons(25000);
Eaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
ret = connect(ds_sock,(struct sockaddr *)&Eaddr,sizeof(Eaddr));
while(ret==-1){
printf("Errore nel connect");
ret = connect(ds_sock,(struct sockaddr *)&Eaddr,sizeof(Eaddr));
}
printf("connect OK");
close(ds_sock);
}
【问题讨论】:
-
在
dd之后添加换行符'\n',或者改为fprintf(stderr, "dd");。 -
第二个例子产生输出可能只是因为程序是短暂的并且当程序退出时输出缓冲区被刷新。否则,它将具有相同的行为(尝试在最后一个
close之后添加sleep(30)语句以亲自查看)。 -
您可能希望通过选择一个有效的入口点来构建一个不会表现出未定义行为的程序。
void main()不是其中之一。 -
如果你 1) 注意listen() 的返回值,你会发现它更容易,2) 让每个 printf("dd") 输出唯一的值,这样你就知道在哪里他们是起源。 3)没有数据正在通信,所以没有迹象表明套接字工作。 4)跳过接受和连接的while循环,因为如果失败一次,它总是会失败。