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

问题描述

用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 connectn");
    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 createdn");
    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 ,quitn");
                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 quitn");
            break;
            }
            len=send(sockfd,buf,strlen(buf)-1,0);
            if(len<0){
            perror("send");
            break;
            }
        }
    }
    close(sockfd);
    return 0;
}

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


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

解决方案

有两个问题:

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

解决方案二:

你这个服务器端代码跟你执行的程序对不上吧?

message recv successful这样的字眼没见你服务器端代码里有啊,你仔细对照一下你的程序是不是你那份代码编译出来的?或者还是你改了代码没重新编译。

时间: 2024-09-11 08:45:53

网络编程-用socket写了个linux聊天的小程序,一客户端一直输出接受消息成功 ==的相关文章

Unix网络编程 之 socket简介

概述         Socket的英文原意是"孔"或"插座",现在,作为Unix的进程通信机制,常常取"插座"这一意义.日常生活中常见的插座,有的是信号插座,有的是电源插座,有的可以接收信号或能量,有的可以发送信号或能量.举例来说,电话线与电话机之间需要一个插座(相当于两者之间的接口,这一部分装置物理上是存在的).对于网络编程,socket就相当于电话线与电话机之间的插座.        将电话系统与面向连接的Socket机制相比,两者之间有着

c++ win32编...-我写了一个win32项目的小程序 如何发给别人自动正常运行

问题描述 我写了一个win32项目的小程序 如何发给别人自动正常运行 把写好的程序打包为exe文件 但是发给朋友显示缺少库文件 然后在程序本身的文件夹中并没有库文件啊 百度一下很多说应该把debug版本改为release版本 改过之后依旧不行 本人新手刚接触win32程序 怎么办 解决方案 程序研究+写花了一天 调试运行在我电脑上都好好的 一发给别人就不行了 好尴尬

刚学的java,写了个压缩文件的小程序,一直没有成功

问题描述 刚学的java,写了个压缩文件的小程序,一直没有成功 public class f2Test { public static void main(String[] args){ frame02 f2=new frame02(); } } import java.awt.BorderLayout; import java.awt.Color; import java.awt.Image; import java.awt.Menu; import java.awt.MenuBar; imp

网络编程-利用socket编程,实现windows 和Linux 互相传输数据。

问题描述 利用socket编程,实现windows 和Linux 互相传输数据. 利用socket编程,实现windows 和Linux 互相传输数据.以windows为client 以Linux为server.在windows发送命令过去,将数据传输过去,在Linux上接受.进而在windows上再次发送一条命令过去,在将数据读取回来.大家有什么好的办法. 解决方案 Linux和Windows下socket函数有些许差别,比如socket函数返回值Linux下为int而Windows下为SOC

网络编程-用MFC写的基于TCP的数据发收问题

问题描述 用MFC写的基于TCP的数据发收问题 服务器接收时,将数据源源不断的读取并显示,如果数据量很大的话,显示到edit文本框上会出现主界面卡住的状态,直到数据全部接收完成,主界面才会恢复顺畅.我现在在fd_read后面创建了线程,不过那个是个循环过程,意味进程不断的在创建启动,但是我建立的线程并不能解决界面卡的问题,求更有效的办法,急急... 解决方案 MFC写的一个界面遇到的问题 解决方案二: 通过线程发送消息给主界面更新,然后就是控制更新频率,UI没必要更行那么频繁

聊聊程序员如何学习英语单词:写了一个记单词的小程序

背景: 关于英文对程序员的重要性,就不多说了! 英语的学习,有很多,今天也不聊多,只聊英语单词! 关于单词的记忆,找过很多方法,下载过很多软件. 如图(其它不好用的都卸载了): 上图算是我以前用过软件,注意,是以前哦~~~ 意思就是没有坚持下来~~~~ 随时间的推移,最后它们还是被我遗忘了~~~ 为什么???不能:坚持!坚持!坚持! 学习思考: 一直在找方法: 1:下载过联想记忆法.背文章记单词,词根,各种视频~~~ 2:连单词的数据库都网上下载了一份了,期望从数据库的直接记忆单词快些~~~ 通

Unix网络编程 之 socket基础

基本结构 (这部分的地址均为网络地址<网络字节序>) 1.struct sockaddr:通用套接字地址结构     此结构用于存储通用套接字地址.    数据结构定义: typedef unsigned short sa_family_t; struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; /* 14 bytes of protocol address */ };  

网络编程-我想用c在linux上做一个爬虫,但是遇到有些网站不能用ip访问求一个解决方案

问题描述 我想用c在linux上做一个爬虫,但是遇到有些网站不能用ip访问求一个解决方案 比如58同城,我ping出它的ip,然后用浏览器访问,结婚连接不上!求各位大神帮帮忙! 解决方案 用域名访问,在你的http请求中加上host字段,里面写域名

java网络编程-java socket实现两台电脑通信

问题描述 java socket实现两台电脑通信 大学生 菜鸟一个 现在自己电脑创了 发送端,接收端,可行 然后同样的代码,将发送端目的ip改为宿舍一台电脑ip,就没反应了.怎么回事啊? 防火墙吗?还是ip地址不对.两台机一个网,一个是192.168.1.102,一台是103 解决方案 没反应是什么意思,指发送端? 解决方案二: 原因很多..硬件软件的可能性都有. 都会在中间阻止或者消亡http请求..最好把你的代码,和网络环境说一下. 解决方案三: 端口看看有没有被占用吧 解决方案四: 试试