我正在尝试通过编写套接字侦听器程序来模拟telnetfunction,并将应用程序通过套接字redirect到侦听器。
在服务器端,我在本地ip(一个定义的端口)上打开一个套接字,然后像这样开始监听
sockfd = socket(AF_INET,SOCK_STREAM,0); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); bind(sockfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr); Listen(sockfd,5); neewsockfd = accept(sockfd,(struct sockaddr*)&cli_addr,&clIEn);
然后,我开始像这样在一个单独的线程中读取传入的数据:
while(1) { bzero(buffer,256); n= read(newsockfd,buffer,255); if(n>0) printf("%s",buffer); }
在听音码后的主例程中,我join了这样的套接字数据发送部分。
recvfrom失败,错误11
windows对每台机器同时打开的套接字/连接数量的限制
使用非pipe理员帐户的windows pgm套接字访问错误
ZeroMQ:每个数据types的套接字还是只有一个套接字?
Socket编程C / C ++ – recv函数在服务器中挂起
while(1) { bzero(buffer,256); getline(&buffer,&t,stdin); n=send(newsockfd,strlen(buffer),MSG_EOR); }
而对于客户端部分,我已经连接到这样的服务器。
sockfd = socket(AF_INET,0); portno = atoi(argv[1]); serv_addr.sin_family = AF_INET; inet_pton(AfF_INET,hostip,&serv_addr.sin_addr.s_addr) serv_addr.sin_port = htons(portno); connect(sockfd,serv_addr,sizeof(serv_addr));
然后我欺骗stdin,stdout和stderr sockfd描述符redirect控制台,如下所示。
dup2(sockfd,STDIN_fileNO); dup2(sockfd,STDOUT_fileNO); dup2(sockfd,STDERR_fileNO); close(sockfd);
最后我在客户端有这样的东西来testing控制台redirect
while(1) { bzero(mystring,256); i = getline(&string,stdin); printf("input:%s-%dn",mystring,i); }
在上面的代码中,我希望getline被阻塞,直到我在服务器应用程序控制台上input一些字符,但是对于我的痛苦,它反复出现值0。
任何想法为什么这种行为?
linux C:获取默认接口的IP地址
TCP套接字超时configuration
在linux上的Socket性能
连接到本地虚拟机
套接字编程gfortran
用stdio(3)混合插座stdio(3)是一个坏主意TM 。 stdin和stdout都是行缓冲的 ,请参阅setbuf(3) ,这可能是什么让你在这里。 还有一个线程安全问题 – stdio流被锁定,但是由于您已经使用GNU扩展,您可以尝试解锁对应的对象。
编辑0:
根据您在意见中的意见,我认为这将是解决方案:
在fork(2)之前在父进程中创建一个pipe(2) fork(2)
在fork(2)但在execve(2)之前, dup2(2)管道的读文件描述符被转换成STDIN ,
在刚exec子进程中只读标准输入
在父进程中将标准输入复制到管道的写入文件描述符中。
这应该避免大部分的困惑。
总结以上是内存溢出为你收集整理的getline()函数行为奇怪全部内容,希望文章能够帮你解决getline()函数行为奇怪所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)