c语言socket的一个比较怪的菜鸟问题

发布于 2022-09-02 12:43:40 字数 2913 浏览 7 评论 0

小弟接触C也没多久  今天调试个程序  发现个诡异的问题 !!

如果加上 printf("\n"); 程序就出问题 虽然编译也能通过,也能运行 但是就是客户端发送消息 服务端收不到
如果去掉 printf("\n"); 就神奇的好了 真是好奇怪 有老鸟有空帮忙看看吗

下面是服务端代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include<unistd.h>
#define SERVER_PORT 8000
#define MAXLINE 4096


int main() {

    struct  sockaddr_in serveraddr,clientaddr;
    int sockfd,addr_len, confd ,len ,i;
    char ipstr[128];
    char buf[MAXLINE];


    //socket create
    sockfd = socket(AF_INET,SOCK_STREAM,0);

    //初始化地址
    bzero((struct sockaddr  *)&serveraddr,sizeof(serveraddr));  //清零
    serveraddr.sin_family = AF_INET;  // iPv4
    serveraddr.sin_addr.s_addr =  htonl(INADDR_ANY);   //监听的IP地址 任何IP
    serveraddr.sin_port = htons(SERVER_PORT);  //监听端口
    bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));  //绑定socket

    //开启监听 并且设置最大连接数
    listen(sockfd,128);//开启监听

    while(1) {
        //阻塞客户端请求
        addr_len = sizeof(clientaddr);
        confd = accept(sockfd,(struct sockaddr *)&clientaddr,&addr_len);
        printf("client  ip = %s:%d\n",
        inet_ntop(AF_INET,&clientaddr.sin_addr.s_addr,ipstr,sizeof(ipstr)),
        ntohs(clientaddr.sin_port));

        //处理客户端请求
        len = read(confd,buf,sizeof(buf));
        i = 0;
        while(i < len) {
            buf[i] = toupper(buf[i]);
            i++;    
        }
        write(confd,buf,len);
        printf("\n");
        write(STDOUT_FILENO,buf,len);
        printf("\n");
        close(confd);
    }
    close(sockfd);



    return 0;    
}     

下面是客户端代码

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

#define SERVER_PORT 8000
#define MAXLINE 4096

int main(int argc,char *argv[]) {

    struct sockaddr_in serveraddr;
    int confd ,len ,i;
    char ipstr[] = "192.168.8.80";
    char buf[MAXLINE];

    if(argc < 2) {
        printf("./client not message!\n");
        exit(1);    
    }


    confd = socket(AF_INET,SOCK_STREAM,0);

    bzero(&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    inet_pton(AF_INET,ipstr,&serveraddr.sin_addr.s_addr);
    serveraddr.sin_port = htons(SERVER_PORT);

  //连接到服务器    
    connect(confd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));

    // 请求服务器处理数据
    write(confd,argv[1],strlen(argv[1]));
    len = read(confd,buf,sizeof(buf));
    write(STDOUT_FILENO,buf,len);
 
    //关闭socket
    close(confd);    
    return 0;
}

感觉有时候好 有时候不好 真的好诡异

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

看春风乍起 2022-09-09 12:43:40
write(STDOUT_FILENO,buf,len);

write使用的是无缓冲的读写方式,
printf之类的标准IO是缓冲式的,
就是write说写入STDOUT_FILENO的东西是会立即显示到终端上的,特意运行了代码,没有发现楼主的问题 。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文