2 fantalee fantalee 于 2016.04.07 10:49 提问

网络编程新手求指导---客户端为何write()始终返回0

在本机上做实验,客户端输入文字在服务器端显示

客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>

#define portnumber 3333

int main(int argc, char *argv[])
{
    int sockfd, nwrite=0;
    char buffer[1024];
    struct sockaddr_in server_addr;
    struct hostent *host;

    /*检查输入格式*/
    if(argc != 2)
    {
        fprintf(stderr,"Usage: %s hostname\n",argv[0]);
        exit(1);
    }

    /*使用hostbyname获取host名字*/
    if((host = gethostbyname(argv[1])) == NULL)
    {
        fprintf(stderr,"gethostname error!\n");
        exit(1);
    }

    /*建立socket描述符*/
    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        fprintf(stderr,"Socket error!\n");
        exit(1);
    }

    /*客户程序填充服务器端资料*/
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port    = htons(portnumber);
    server_addr.sin_addr    = *((struct in_addr *)host->h_addr);

    /*客户端发起连接*/
    if(connect(sockfd,(struct sockaddr *)(&server_addr),
       sizeof(struct sockaddr)) == -1)
    {
        fprintf(stderr,"fail to connect!%s\n", strerror(errno));
        exit(1);
    }

    /*链接成功*/
    printf("Please input char:\n");

    /*发送数据*/
    fgets(buffer,1024,stdin);
    printf("%s", buffer);
    if((nwrite = write(sockfd,buffer,strlen(buffer)) == -1))
    {
        printf("write error!\n");
    }
    printf("nwrite = %d\n", nwrite);//为何一直返回0 ?写不进去?
    /*关闭连接*/
    close(sockfd);

    exit(0);

}

服务器端

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>

#define portnumber 3333

int main(int argc, char *argv[])
{
    int sockfd;
    int nbytes;
    int sin_size;
    int new_fd;
    char buffer[1024];
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;

    /*服务端创建套接字*/
    if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
    {
        fprintf(stderr, "Create socket error!\n");
        exit(1);
    }

    /*结构清零*/
    bzero(&server_addr, sizeof(struct sockaddr_in));
    {
        server_addr.sin_family      = AF_INET;
        server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
        server_addr.sin_port        = htons(portnumber);
    }

    /*绑定结构*/
    if(bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
    {
        fprintf(stderr, "Bind error! %s\n", strerror(errno));
        exit(1);
    }

    /*监听套接口设置最大监听个数*/
    if(listen(sockfd,5) == -1)
    {
        fprintf(stderr, "listen setting error!\n");
        exit(1);
    }

    while(1)
    {
        sin_size = sizeof(struct sockaddr_in);
        if(new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size) == -1)
        {
            fprintf(stderr, "accept error!\n");
            exit(1);
        }

        /*与客户端连接成功*/
        fprintf(stderr, "Server get connction from %s\n", inet_ntoa(client_addr.sin_addr));
        if((nbytes = read(new_fd, buffer, 1024)) == -1)
        {
            fprintf(stderr, "read error!\n");
            exit(1);
        }

        buffer[nbytes] = '\0';

        printf("Received from client %s : %s", inet_ntoa(client_addr.sin_addr), buffer);

        close(new_fd);

    }

    close(sockfd);

    exit(0);

}

运行结果:
图片说明

1个回答

allbule
allbule   2016.04.07 13:11
已采纳

括号那里改一下试试 nwrite = write(sockfd,buffer,strlen(buffer));
if( ..... )
......

allbule
allbule 回复allbule: 不对,是改成if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size) )== -1)
2 年多之前 回复
allbule
allbule 回复fantalee: if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size) == -1)改为if(new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size) )== -1)记住以后千万别这么写,分开写!!!请采纳
2 年多之前 回复
fantalee
fantalee 果然返回正常啦~~,可是为什么我的服务端还是没有打印出字符呢? 再次求大神指导啊
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java.nio中socketChannle.write()返回0的简易解决方案
之前使用Java IO实现了一个文件传送的小demo,今天打算采用java nio重写一遍。 首先,用nio写好文件接收端后,采用原先的IO程序测试,发现并不存在问题。 接着,写文件发送端,ByteBuffer大小设置为1024,发送端分多次发送文件片段,在接受端组合形成文件,近而写入文件系统。 程序写好后: 1,用一个2K的文件测试,发现并无问题 2,用一个44k的文件测试,发现接收端
socket编程中write返回-1的问题
<br />作为服务器,有客户端连接进来。TCP协议。<br />当客户端断开连接的时候,按道理说write将会不成功的。<br />那么当write不成功的时候是应该返回-1的。<br /> <br />实际情况是,当客户端断开的时候,write仍然会成功,再下一次才会失败。<br />而失败了之后,进程就结束掉了。没有返回-1.<br /> <br />google之后知道:<br />客户端关掉之后,再往这个文件描述符中写东西会引发一个SIGPIPE信号,这个信号的默认动作就是让进程结束掉。……。好吧
Linux下的read,write函数
read 函数从打开的设备或文件中读取数据。 #include ssize_t read(int fd, void *buf, size_t count); 返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0 参数 count 是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移
SXSSFSheet调用createRow报错,并且调用getLastRowNum一直为0的问题
SXSSFSheet的调用getLastRowNum一直为0,createRow抛出异常
SetWindowsHookEx始终返回0
     只要禁止了宿主进程即可在 Visual Studio 中打开项目。在“项目”菜单上单击“属性”。单击“调试”选项卡。清除“启用 Visual Studio 宿主进程”复选框。这样就可以调试了。参考我的博客:http://www.myoob.cn/post/2009/11/11/SetWindowsHookExe5a78b
FastReport中TotalPages显示为0
将报表———选项——双通道  勾选即可
如何学编程
对于编程新手的入门指导
向SocketChannel写入数据并读取返回数据
package net.java2000.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SocketChannel;/** * 向SocketChannel写入数据并读取返回数据。 *  * @author 赵学
socket中的read返回0
在socket中服务器与客户端进行通信,当其中一方调用close(即这一方会发送一个fin)关闭套接字之后,另一方read()会返回一个0。 我之前编写的一个服务器与客户端通信(一个服务器只连接一个客户端):服务器开两个进程,一个用于接收客户端发送的数据,另一个进程用于 向客户端发送数据。客户端开两个进程也是一个用于发送数据一个用于接收数据。由于创建了两个进程,那么套接字的引用计数都为2,只有
checkSelfPermission总是返回PERMISSION_GRANTED
今天在实现录音功能的权限申请时遇到了问题,然后网上找资料,基本都是分割线下面的解决方法,但是在我的Smartisan OS V3.7.0.2(android 6.0  23), 项目中target sdk version设置为了22。 令人疑惑的是 录音权限在设置为每次询问时,PermissionChecker#checkSelfPermission总是返回PERMISSION_GRANTED,