连接错误:Ubuntu中C语言的简单套接字编程

我的老师提供了一个套接字程序示例-从服务器获取日期时间,但是我不能很好地运行该程序。我在终端上运行服务器,然后在另一个终端上运行客户端(使用“ ./client 127.0.0.1”),然后出现“连接错误”。我已经将“打印”替换为“错误”,然后收到错误消息:“连接被拒绝”。

我不知道这是怎么回事。您能帮我解决问题吗?您可以修改我的代码以使其运行,然后将其粘贴到此处。我只想从服务器获取当前时间

我的代码在这里:

datetime.h:

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define MAXLINE 4096

datetimes.c:

/****************************************************/
/************* datetime Example Server **************/
/****************************************************/
#include "datetime.h"
#include <sys/time.h>

int
main( int argc , char * * argv )
{
    int listenfd , connfd;
    struct sockaddr_in servaddr;
    char buff[ MAXLINE ];
    time_t ticks;

    listenfd = socket( AF_INET , SOCK_STREAM , 0 );

    memset( &servaddr , 0 , sizeof( servaddr ) );
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl( INADDR_ANY );
    servaddr.sin_port = htons( 13 );

    bind( listenfd , (struct sockaddr *)&servaddr , sizeof( servaddr ) );
    listen( listenfd , 1024 );

    for( ; ; )
    {
        printf("Before Accept...\n");
        connfd = accept( listenfd , (struct sockaddr *)NULL , NULL );
        ticks = time( NULL );
        snprintf( buff , sizeof( buff ) , "%.24s\r\n" , ctime( &ticks ) );
        write( connfd , buff , strlen( buff ) );
        close( connfd );
    }
}

datetimec.c:

/****************************************************/
/************* datetime Example Client **************/
/****************************************************/

#include "datetime.h"

int main( int argc , char * * argv )
{
    int sockfd , n ;
    char recvline[ MAXLINE + 1];
    struct sockaddr_in servaddr;

    if( argc != 2 )  {
        printf( "usage : a.out <IP address>\n" );
        exit( 1 );
    }

    if( ( sockfd = socket( AF_INET , SOCK_STREAM , 0 ) ) < 0 ) {
        printf( "socket error\n" );
        exit( 1 );
    }

    memset( &servaddr , 0 , sizeof( servaddr ) );
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons( 13 );

    if( inet_pton( AF_INET , argv[ 1 ] , &servaddr.sin_addr ) <= 0 )  {
        printf( "inet_pton error for %s\n" , argv[ 1 ] );
        exit( 1 ); 
    }

    if( connect( sockfd , (struct sockaddr *)&servaddr , sizeof( servaddr ) ) < 0 )  {
        printf( "connect error\n" );
        exit( 1 );
    }

    while( ( n = read( sockfd , recvline , MAXLINE ) ) > 0 )  {
        recvline[ n ] = 0;
        if( fputs( recvline , stdout ) == EOF ) {
            printf( "fputs error\n" );
            exit( 1 );
        }
    }

    if( n < 0 )  {
        printf( "read error\n" );
        exit( 1 );
    }
    exit( 0 );  
}
宪法

您应该同时更改13客户端和服务器中的端口号(当前:):

servaddr.sin_port = htons( 13 );

值大于1024,因为前1024个porst保留用于根访问,并且其中许多已经被某些服务使用(实际上,13是日间协议的端口号)。

我相信您的经纪人希望您仅从服务器获取日期时间,而不使用日期时间协议。

但是,由于以下这一行,因此在纠正端口后,您的代码将给出SEGFAULT:

snprintf( buff , sizeof( buff ) , "%.24s\r\n" , ctime( &ticks ) );

要解决这个问题:

  1. strncpy()改为使用,即将该行更改为:strncpy(buff, ctime(&ticks), MAXLINE);
  2. 使用ctime()从正确的头文件功能:改变<sys/time.h><time.h>你具备。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

套接字编程连接错误

来自分类Dev

Ubuntu中的C ++ UDP套接字编程

来自分类Dev

Python中的简单套接字编程:错误的服务器

来自分类Dev

Java套接字编程中的连接拒绝错误

来自分类Dev

Java套接字编程中的连接拒绝错误

来自分类Dev

连接列表在C套接字编程中显示0.0.0.0

来自分类Dev

linux中的分段错误(C中的套接字编程(TCP))

来自分类Dev

linux中的分段错误(C中的套接字编程(TCP))

来自分类Dev

c#套接字编程错误

来自分类Dev

使用C语言中的套接字编程下载图像

来自分类Dev

连接中的Lua套接字错误

来自分类Dev

用C连接到远程主机(套接字编程)

来自分类Dev

套接字编程指针错误

来自分类Dev

C中的队列套接字连接

来自分类Dev

D编程语言中的UDP套接字

来自分类Dev

D编程语言中的UDP套接字

来自分类Dev

有关C语言(Linux)中套接字服务器客户端编程中accept()的问题

来自分类Dev

如何在localhost + ubuntu中测试PHP套接字编程

来自分类Dev

如何在localhost + ubuntu中测试PHP套接字编程

来自分类Dev

套接字编程C ++错误未定义参考

来自分类Dev

套接字错误:[Errno 111]在Ubuntu上拒绝连接

来自分类Dev

C中的套接字“监听”错误

来自分类Dev

Clojure中的套接字编程

来自分类Dev

套接字编程中的ProgressMonitorInputStream

来自分类Dev

UNIX中的套接字编程

来自分类Dev

套接字编程-连接尝试失败异常

来自分类Dev

无法转换为C中的指针类型套接字编程

来自分类Dev

在C套接字编程中写入/读取整数的正确方法

来自分类Dev

C ++套接字编程,使用getaddrinfo中的url:port / url