#include <sys/socket.h>
#include<stdio.h>
#include <netinet/in.h>
#include<string.h>
int init_socket(int *fd, int port){
struct sockaddr_in serv_addr, cli_addr;
*fd = socket(AF_INET, SOCK_STREAM, 0);
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
bind(*fd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr))
listen(*fd,1); //Change as per requirement
}
int connect_server()
{
int fd, j, result;
fd_set readset;
init_socket(&fd,6001);
while(1){
FD_ZERO(&readset);
FD_SET(fd, &readset);
select(3, &readset, NULL, NULL, NULL);
}
}
int main(){
printf("Main Start");
connect_server();
printf("Main End");
}
我正在尝试执行此代码,但没有显示printf()。当从代码中删除select()时,printf()正常工作。为什么会这样?
答案 0 :(得分:2)
stdio 已缓冲。您应该使用printf
来调用fflush(3)(或至少结束每个\n
格式字符串)。所以添加
fflush(NULL);
在select
来电之前。
BTW,更好地使用poll(2)然后select
。阅读C10K problem
您的代码应该测试系统调用失败,例如socket
,connect
,select
或poll
等等...等等使用perror
此外,使用所有警告和调试信息(gcc -Wall -g
)进行编译,并了解如何使用调试器(gdb
)以及strace(1)。< / p>
答案 1 :(得分:1)
通过在字符串末尾添加换行符再试一次:
int main(){
printf("Main Start\n");
connect_server();
printf("Main End\n");
}
原因:stdout
是行缓冲的,你需要给它一个新行来刷新输出。
或者fflush(stdout);
显式刷新它。