C 为什么我的程序不能用printf输出任何东西?
我是一名网络编程课程的学生,我正在编写一个UDP客户端,它连接到三台服务器进行文件传输。到目前为止,我已经让客户端与前两台服务器通信,但服务器的第三个副本不起作用。它甚至没有打印出我输入的printf调试语句。发生了什么事?Unix有什么问题吗?前两个服务器与此服务器完全相同,端口/ip地址发生了变化,它们工作得非常好C 为什么我的程序不能用printf输出任何东西?,c,network-programming,C,Network Programming,我是一名网络编程课程的学生,我正在编写一个UDP客户端,它连接到三台服务器进行文件传输。到目前为止,我已经让客户端与前两台服务器通信,但服务器的第三个副本不起作用。它甚至没有打印出我输入的printf调试语句。发生了什么事?Unix有什么问题吗?前两个服务器与此服务器完全相同,端口/ip地址发生了变化,它们工作得非常好 #include <stdlib.h> #include <arpa/inet.h> #include <netinet/in.h> #inc
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <strings.h>
int main(int argc, char**argv)
{
printf("i will destroy you");
int o = 1;
int sockfd,n;
struct sockaddr_in servaddr,cliaddr;
socklen_t len;
char mesg[1000];
printf("im confused");
sockfd=socket(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servaddr.sin_port=htons(3454);
bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
printf("yo wtf");
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &o, sizeof(o)) < 0){
perror("setsockopt failed");
exit(0);
}
printf("here1");
while(1)
{
len = sizeof(cliaddr);
printf("here");
n = recvfrom(sockfd,mesg,1000,0,(struct sockaddr *)&cliaddr,&len);
sendto(sockfd,mesg,n,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
printf("-------------------------------------------------------\n");
mesg[n] = 0;
printf("Received the following:\n");
printf("%s",mesg);
printf("-------------------------------------------------------\n");
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
printf(“我会毁掉你”);
INTO=1;
int-sockfd,n;
servaddr、cliaddr中的结构sockaddr\u;
索克伦;
char-mesg[1000];
printf(“我很困惑”);
sockfd=插座(AF_INET,SOCK_DGRAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=inet_addr(“127.0.0.1”);
servaddr.sinu port=htons(3454);
绑定(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
printf(“yowtf”);
if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&o,sizeof(o))<0){
perror(“设置锁定失败”);
出口(0);
}
printf(“此处1”);
而(1)
{
len=sizeof(cliaddr);
printf(“此处”);
n=recvfrom(sockfd,mesg,1000,0,(结构sockaddr*)和cliaddr,&len);
sendto(sockfd,mesg,n,0,(struct sockaddr*)和cliaddr,sizeof(cliaddr));
printf(“--------------------------------------------------------------\n”);
mesg[n]=0;
printf(“收到以下信息:\n”);
printf(“%s”,mesg);
printf(“--------------------------------------------------------------\n”);
}
}
您没有刷新stdout
或者,使用中的stderr
fprintf(stderr,"My message\n");
您没有刷新stdout
或者,使用中的stderr
fprintf(stderr,"My message\n");
您可能需要更改,例如,printf(“我会毁掉你”)
到printf(“我会毁掉你”)
。或参见setbuf()
。或者使用fflush(stdout)
您可能需要将例如printf(“我会毁灭你”)
更改为printf(“我会毁灭你”)
。或参见setbuf()
。或者使用fflush(stdout)
作为开始,将\n
放在printf
字符串的末尾。您可能看不到它们,因为它们已缓冲。如果希望输出消息显示,请确保它们以换行结束。前两个printf()
语句不会以换行符结尾;只有在输出换行符,或使用fflush(stdout)
(或在一行上打印太多数据,使其不再适合stdout的文件*
中的缓冲区)后,才会显示其输出。printf(3)
输出通常是缓冲的,只有在缓冲区(largeish)填满时才会写入。您可以使用fflush(stdout)
强制输出。首先,请将\n
放在printf
字符串的末尾。您可能看不到它们,因为它们已缓冲。如果希望输出消息显示,请确保它们以换行结束。前两个printf()
语句不会以换行符结尾;只有在输出换行符,或使用fflush(stdout)
(或在一行上打印太多数据,使其不再适合stdout的文件*
中的缓冲区)后,才会显示其输出。printf(3)
输出通常是缓冲的,只有在缓冲区(largeish)填满时才会写入。您可以使用fflush(stdout)
强制输出。它现在可以打印了。为什么需要换行符?有时在我的其他程序中我忽略了它,但它仍然显示在终端提示之前的某个地方。scanf
,etc使用stdin
,与stdout
,这样提示就不会被乱码。一个小点是:行mesg[n]=0代码>不太正确n
可能是1000
,因此nul放在数组末尾。(当然,如果您希望检查错误,n
可以是-1。)请看,从stdin读取是否会刷新stdout?但是那里的答案似乎与我的评论不一致。\n
总是保证齐平吗?现在可以打印了。为什么需要换行符?有时在我的其他程序中我忽略了它,但它仍然显示在终端提示之前的某个地方。scanf
,etc使用stdin
,与stdout
,这样提示就不会被乱码。一个小点是:行mesg[n]=0代码>不太正确n
可能是1000
,因此nul放在数组末尾。(当然,如果您希望检查错误,n
可以是-1。)请看,从stdin读取是否会刷新stdout?但是那里的答案似乎与我的评论不一致。\n
是否总是保证同花顺?