开发者社区> 问答> 正文

用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;
}

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

展开
收起
小旋风柴进 2016-06-03 09:38:38 2499 0
1 条回答
写回答
取消 提交回答
  • 有两个问题:

    你bind之后没有调用Listen函数
    socklen_t是无符号整型,你用socklen_t len这个变量去存储recv的返回值,然后又判断它是否大于0,结果就是:返回值为-1,但判断结果会认为这是个正数,所以accept、recv看起来都成功了,你的程序就到死循环里去了。其实你accept的时候就失败了,因为之前没调用listen函数。

    2019-07-17 19:25:57
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载