linux下socket编程 服务器没输出给客户端却输出到屏幕上

我被老师骗了,今天尝试linux下的socket编程,照着老师给的代码结果出现了题目的问题。
这是服务器一直接受连接,并把字符串char s[]="Hello World"传输给每一个客户端的部分

while(1){ //接收客户端连接
    sin_size=sizeof(struct sockaddr_in);
    if((new_fd=accept(sockfd,(struct sockaddr*)&client_addr,(socklen_t*)&sin_size)==-1)){
//accpet提取出被监听套接字等待队列中第一个请求创建一个新套接字并返回新套接字文件描述符
        fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
        exit(1);}
    fprintf(stderr,"Server get connection from %s\n",
            new_fd,inet_ntoa(client_addr.sin_addr));
//inet_ntoa将网络地址转换成“.”点隔的字符串格式
    if(write(new_fd,s,strlen(s))==-1){
        fprintf(stderr, "Write error:%s\n", strerror(errno));
        exit(1);}
     close(new_fd);
 }

大家可以找找是哪的问题,我后面会慢慢讲。
结果第一个客户端没收到消息,而服务器的窗口却写上了Hello World,后面的客户端就正常了。
我一开始怀疑write的行为和缓存一样,必须等到close()才能把东西输出,第一个没输出可能是第一个客户端的close()输出给了第二个客户端。于是我又在while一开始加了close()。
结果果然是对了,后来又好奇为什么第一个会输出到屏幕,查了一下linux下标准有3个文件描述符是默认的STDIN_FILENO=0 ; STDOUT_FILENO=1 ; STDERR_FILENO=2 ;write()在文件描述符是0,1,2时都是输出到屏幕的,于是我print出(new_fd),居然是0。
众所周知在申请文件描述符时都是按顺序申请的,为什么accpet()会从0开始申请,我又在网上找accept分配的文件描述符为什么是0,但找来找去都没有,我又试了试手动分配new_fd的值,结果没有改变,accpet总能给你把它变成0。
直到我试到了5,居然正确输出给客户端了,而这个函数前面刚好用了3和4号描述符,再看accepe的返回值依旧是0,我就懂了。
accpet()返回的并不是文件描述符,-1就是失败 0就是成功,不过我没找到得到刚申请的文件描述符的方法,好在这个值是顺序申请的,而且前面也没有close(),write直接写sockfd+1,或5就行了。不过老实说如果accept返回文件描述符的确会简单很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值