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

1个回答

嗨,楼主,你客户端代码创建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);
    }

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

2
Win10安装的VMware中的Ubuntu系统上启动的ftp服务端程序无法被在其他机器上的ftp客户端连接上?
4
手机创建的socket长连接可以维持多长时间
3
java socket通讯 服务端如何主动给指定的客户端发送消息?
1
java socket 在内网和外网传输问题
0
p用python实现socket通信,多客户端接入,服务器与客户端交互数据
2
希望各位大佬能够解答困惑。Java socket客户端输出结束但不关闭流,服务器端如何判断传输完成?
4
怎样socket指定客户发送消息
1
如今的ERP系统三层CS架构开发,客户端与服务端是以什么方式连接?socket或webservice或servlet等其他?
1
DEVC++中使用winsock2进行TCP编程的客户端无法接收到服务器返回数据的问题
1
tcp socket服务端如何支持wss协议
4
在socket中,如何让客户端固定它的端口
7
TCP传输,客户的程序一直不停的建立socket连接,不断开,最终导致我的服务端崩溃
3
websocket只连接了一个客户客户端互发消息,但是每发一次消息,服务端就提示连接人数加一个,这是为什么
1
我在react和node服务器之间想使用socket.io进行通信中出现的问题
1
Java 如何在建立 Socket 通信后主动向 C#客户端发送信息
2
C# 单客户端 多服务器同时收发数据
4
QT平台Socket编程问题
2
c# socket链接 发送请求2-4个直接断开连接
1
linux 上使用atomikos连接Oracle失败?
2
C++ Linux网络编程,超简单的例子,就是不知道什么原因,客户端收不到消息