「已注销」 2019-10-26 06:01 采纳率: 100%
浏览 1216
已采纳

linux 下socket编程,客户端连接服务器失败

最近因为课程需要学习socket网络编程,运行的时候客户端无法与服务器建立连接,请原谅菜鸟没有积分,希望各位大佬给点帮助,解决下问题
这个是运行报错的截图
图片说明

以下是按照课本上编写的代码
客户端client.c

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


#define PROTOPORT 5188
extern int errno;
char localhost[] = "localhost";
int main(int argc, char* argv[])
{
    struct hostent *ptrh;
    struct sockaddr_in servaddr;
    int sockfd;
    int port;
    char* host;
    int n;
    char buf[1000];
    memset((char*)&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;

    if(argc > 2){
        port = atoi(argv[2]);
    }else{
        port = PROTOPORT;
    }
    if(port > 0){
        servaddr.sin_port = htons((uint16_t)port);
    }else{
        fprintf(stderr, " bad port number %s\n", argv[2]);
        exit(1);
    }

    if(argc > 1){
        host = argv[1];
    }else{
        host = localhost;
    }

    ptrh = gethostbyname(host);
    if((char*)ptrh == NULL){
        fprintf(stderr, " invalid host: %s\n", host);
        exit(1);
    }
    memcpy(&servaddr.sin_addr, ptrh->h_addr_list[0], ptrh->h_length);

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd > 0){
        fprintf(stderr, " socket creation failed\n");
        exit(1);
    }
    //请求连接到服务器
    if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))){
        fprintf(stderr, "connect failed\n");
        exit(1);
    }

    //从服务器读取数据,显示到用户屏幕上
    n = recv(sockfd, buf, sizeof(buf), 0);
    while(n > 0){
        write(1, buf, n);
        n = recv(sockfd, buf, sizeof(buf), 0);
    }

    //关闭连接
    close(sockfd);

    //退出
    exit(0);
    return 0;
}

服务器端server.c

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

#define PROTOPORT 5188
#define QLEN 6
int visits = 0;
int main(int argc, char * argv[])
{              
    struct sockaddr_in servaddr;            //存放服务器网络地址结构
    struct sockaddr_in clientaddr;         //存放客户机网络地址结构
    int listenfd;
    int clientfd;
    int port;
    int alen;
    char buf[1000];

    memset((char*)& servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = INADDR_ANY;

    if(argc >1){
        port = atoi(argv[1]);
    }else{
        port = PROTOPORT;
    }
    if(port > 0){
        servaddr.sin_port = htons((uint16_t)port);
    }else{
        fprintf(stderr, " bad port nuber %s\n", argv[1]);
        exit(1);
    }

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    if(listenfd < 0){
        fprintf(stderr, "socket creation failed\n");
        exit(1);
    }

    if(bind(listenfd, (struct sockaddr*) & servaddr, sizeof(servaddr)) < 0){
        fprintf(stderr, " bind failed\n");
        exit(1);
    }

    if(listen(listenfd, QLEN) < 0){
        fprintf(stderr, "listen filed\n");
        exit(0);
    }

    while(1)
    {
        alen = sizeof(clientaddr);
        if((clientfd = accept(listenfd, (struct sockaddr*) & clientaddr, (socklen_t*)&alen)) < 0){
            fprintf(stderr, "accept failed\n");
            exit(1);
        }
        visits++;
        sprintf(buf, "this server has been contacted %d time \n", visits);
        send(clientfd, buf, strlen(buf), 0);
        close(clientfd);
    }
    return 0;
}

展开全部

  • 写回答

2条回答 默认 最新

  • 内核之道 PostgreSQL领域优质创作者 2019-10-26 06:20
    关注

    嗨,楼主,你客户端代码创建socket句柄处对返回的判断是有问题的。

     sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if(sockfd  > 0){ 
            fprintf(stderr, " socket creation failed\n");
            exit(1);
        }
            上面这个是你的原代码,需修改为:
             sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if(-1 == sockfd){  //socket创建成功,返回可用的句柄描述符,失败,返回-1。 判断条件错误。
            fprintf(stderr, " socket creation failed\n");
            exit(1);
        }
    

    若有帮助,还望楼主**采纳**!多谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 关于#hadoop#的问题:按照老师上课讲的步骤写的
  • ¥20 有人会用这个工具箱吗 付fei咨询
  • ¥30 成都市武侯区住宅小区兴趣点
  • ¥15 Windows软实时
  • ¥15 自有服务器搭建网络隧道并且负载均衡
  • ¥15 opencv打开dataloader显示为nonetype
  • ¥15 MacOS 80端口外网无法访问
  • ¥50 js逆转反解密-会的来
  • ¥15 wrodpress如何调取数据库并展示
  • ¥15 python梯形积分与GPS测得位移使用卡尔曼滤波融合问题
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部