37334 2015-04-12 05:52 采纳率: 45.5%
浏览 3475
已采纳

用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 ==

 //服务器端代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<malloc.h>
#define MAXBUF 1024
int main()
{
    int pid;
    int sockfd,new_fd;
    socklen_t len;
    struct sockaddr_in my_addr, their_addr;
    unsigned int myport,listnum;
    char buf[MAXBUF+1];
    myport=7575;
    listnum=5;
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
        perror("socker");
        exit(EXIT_FAILURE);
    }
    memset(&my_addr,0,sizeof(my_addr));
    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(myport);
    my_addr.sin_addr.s_addr=inet_addr("192.168.1.106");
    if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
        perror("bind");
        exit(EXIT_FAILURE);
    }
    if(listen(sockfd,listnum)==-1){
        perror("listen");
        exit(EXIT_FAILURE);
    }
    printf("wait for connect\n");
    len=sizeof(struct sockaddr);
    if(new_fd=accept(sockfd,(struct sockaddr *)&their_addr,&len)==-1){
        perror("accept");
        exit(EXIT_FAILURE);
    }
    else
        printf("server:got conection!");
    if((pid=fork())==-1){
        perror("fork");
        exit(EXIT_FAILURE);
    }
    else if(pid==0){
        while(1){
            memset(buf,0,sizeof(buf));
            fgets(buf,MAXBUF,stdin);
            if(!strncasecmp(buf,"quit",4)){
                printf("i will close the connection");
                break;
            }
            len=send(new_fd,buf,strlen(buf)-1,0);
            if(len<0){
            printf("message send failed!");
            break;
        }
      }
    }
    else{
    while(1){
        bzero(buf,MAXBUF+1);
        len=recv(new_fd,buf,MAXBUF,0);
        if(len>0) 
        printf("message recv successful:%s \n",buf);
        else if(len<0){
            printf("recv failed!");
            break;
        }
        else{
            printf("the other one close quit \n");
            break;
         }
      }
   }
        close(new_fd);
        close(sockfd);
        return 0;
}

//客户端的代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<resolv.h>
#include<unistd.h>
#include<arpa/inet.h>
#define MAXBUF 1024
int main()
{
    int sockfd,len,destport=7575;
    struct sockaddr_in dest;
    char buf[MAXBUF+1];
    if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
        perror("socket");
        exit(errno);
    }
    printf("socket created\n");
    memset(&dest,0,sizeof(dest));
    dest.sin_family=AF_INET;
    dest.sin_port=htons(destport);
    dest.sin_addr.s_addr=inet_addr("192.168.1.106");
    if((connect(sockfd,(struct sockaddr *)&dest,sizeof(dest)))==-1){
        perror("connect");
        exit(errno);
    }
    printf("server connected!\n");
    pid_t pid;
    if((pid=fork())==-1){
        perror("fork");
        exit(errno);
    }
    else if(pid==0){
        while(1){
            memset(buf,0,sizeof(buf));
            len=recv(sockfd,buf,MAXBUF,0);
            if(len>0)
                printf("recv successful:%s \n",buf);
            else if(len<0){
                perror("recv");
                    exit(errno);
            }
            else{
                printf("the other one close ,quit\n");
                break;
            }
        }
    }
    else{
        while(1){
            memset(buf,0,sizeof(buf));
            printf("pls send message to send:");
            fgets(buf,MAXBUF,stdin);
            if(!strncasecmp(buf,"quit",4)){
            printf("i will quit\n");
            break;
            }
            len=send(sockfd,buf,strlen(buf)-1,0);
            if(len<0){
            perror("send");
            break;
            }
        }
    }
    close(sockfd);
    return 0;
}

运行客户端和服务器端后,服务器端:
服务器端


客户端:客户端
不知道这是什么情况呢,==

  • 写回答

2条回答 默认 最新

  • 开水 2015-04-12 08:54
    关注

    有两个问题:

    1. 你bind之后没有调用Listen函数
    2. socklen_t是无符号整型,你用socklen_t len这个变量去存储recv的返回值,然后又判断它是否大于0,结果就是:返回值为-1,但判断结果会认为这是个正数,所以accept、recv看起来都成功了,你的程序就到死循环里去了。其实你accept的时候就失败了,因为之前没调用listen函数。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站