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

问题描述

网络编程新手求指导---客户端为何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 hostnamen",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!%sn", 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 = %dn", 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! %sn", 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 %sn", inet_ntoa(client_addr.sin_addr));
        if((nbytes = read(new_fd, buffer, 1024)) == -1)
        {
            fprintf(stderr, "read error!n");
            exit(1);
        }

        buffer[nbytes] = '';

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

        close(new_fd);

    }

    close(sockfd);

    exit(0);

}

运行结果:

解决方案

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

时间: 2024-12-31 19:12:52

服务器-网络编程新手求指导---客户端为何write()始终返回0的相关文章

新手求指导python flask开发web项目经验

问题描述 新手求指导python flask开发web项目经验 大一快结束 参与一个正式的项目,运用python flask框架进行web开发.以前学过c,c++,会写代码.但是学完python,入门了flask框架后,也会写代码,不明白如何在项目里写代码,是我没理解到python的内涵么,还是其他什么原因(求推荐一些开源web开发项目代码学习一下) 解决方案 flask官方文档就带了例子, 基本上就是注册一个route,然后实现自己的函数. 解决方案二: Python 入门,web 开发还是

asp.net获取当前登陆用户的用户名到textbox1中!新手求指导!!

问题描述 asp.net获取当前登陆用户的用户名到textbox1中!新手求指导!! 我要做的是签到页面!获取当前用户!自动获取时间!点击签到!插入一条数据到数据库中! 我是用三层结构做的现在不知道该怎么弄了 解决方案 当前登录用户是存在session里的吗?如果是的话,页面不需要文本框,点击签到按钮,后台从session取用户,再取当前时间,执行语句就行了 解决方案二: 最好是登陆时记录一下已经登陆的用户名,而不是去获取它. 一般来说,如网站都是记录了当前用户信息,使用时直接用. 解决方案三:

新手求指导 VB.NET 如何在datagridview中添加timer列

问题描述 新手求指导 VB.NET 如何在datagridview中添加timer列 datagridview的数据源是一个数据库 我想实现:每当datagridview的数据更新了一行,就在那一行的第一格开始到计时.每一行单独计时. 我定义了一个timer并且能够实现一行的倒计时,但是不知道怎样才能每添加一行都分别倒计时,需要定义很多timer么?datagridview的更新行数是不确定的. 急求指导,非常感谢!

tps linux ngnix-LINUX 新手求指导 TPS 如何计算例如Ab测试数据如下

问题描述 LINUX 新手求指导 TPS 如何计算例如Ab测试数据如下 ab -kc 20000 -n 150000 http://42.96.2.2/carbaomingtt.php This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Softw

rgbd-基于RGBD的室内场景重建 完全新手 求指导

问题描述 基于RGBD的室内场景重建 完全新手 求指导 如题今年大四 现刚到研究生老师这边跟着做.一点基础没有 ,现在第s一步是想根据一幅RGBD图像 做出一个三维图 请问该用什么软件写?又应该如何让两幅图片的点显示出来颜色和深度信息,求指点一二

sql语句-SQL 插入语句 新手求指导求教育

问题描述 SQL 插入语句 新手求指导求教育 INSERT INTO U_USER VALUES( 1,小严,严,,,,,,,,,,,,,);后面的没有写就出现前三个字段列名无效.为什么? 解决方案 为varchar类型的列赋值需要用单引号引起来(1,'小严','严',,,,,,,,,,,)

字体颜色-cocos2d 设置字体的颜色一直变化。。怎么做啊。!!!!新手求指导

问题描述 cocos2d 设置字体的颜色一直变化..怎么做啊.!!!!新手求指导 老师给我我们出了个题目,说是字体的颜色一直变化,要用代码写,还是c++.我们是在x-code环境中.求大神给个代码,解释一下啊!! 解决方案 太简单 update setcolor就行了 解决方案二: 开个定时器 在那跑 颜色随机

新手求指导,c#:使用无限循环制作一个菜单选单,再通过switch语句来选择所要的功能

问题描述 新手求指导,问一下大神们如何制作菜单栏,如下,问一下代码如何写?谢谢•Addcustomer'sdetails(a)•Collecttheusagedata(c)•Calculateanddisplay(d)•Exit(x)①按下a,会显示Addcustomer'sdetails(a)的功能②按下c,会显示Collecttheusagedata(c)的功能③按下d,会显示Calculateanddisplay(d)的功能④按下x,Exit(x) 解决方案 解决方案二:一般是按ALT组合

服务器-网络编程中并未建立连接的端口却能往套接字中写,发送数据,困惑

问题描述 网络编程中并未建立连接的端口却能往套接字中写,发送数据,困惑 拜托各位了,碰上一个难以理解的困惑 情况如下 我在qt中编写了一个客户端(抛开qt,也可以理解为别的写的),在这个应用程序中有一个对象是专门用来建立连接并且处理和服务器的相关的通信. 服务器的话是在linux下c写的,简单的可以看做这种模式accept等待连接,连接成功后阻塞读写 while(1) { clientfd = accept(lfd, null, null): printf("new connectn"