4

我对 unix 编程完全陌生,并为客户端和服务器编程编写了以下代码。当我尝试运行客户端代码时,它显示“连接被拒绝”。有人可以告诉我可能是什么原因。

服务器代码:

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

int main(void)
{
    int sockid,newsockid;
    socklen_t addr_size;
    char *msg="What a beautiful morning!";
    int len, bytes_sent;
    sockid=socket(AF_INET,SOCK_STREAM,0);
    if(sockid==-1)
    {
        perror("socket");
        exit(1);
    }
    else
        printf("created");
    struct sockaddr_in serveraddr,clientaddr;
    bzero((char *)&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(7400);
    serveraddr.sin_addr.s_addr=INADDR_ANY;

    if(bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0)
    {
        perror("bind");
        return -1;
    }

    listen(sockid,5);
    addr_size=sizeof(clientaddr);
    newsockid=accept(sockid,(struct sockaddr *)&clientaddr,&addr_size);
    len = strlen(msg);
    bytes_sent = send(sockid, msg, len, 0);
    close(sockid);
}

客户代码:

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

int main(void)
{
    int byte_count;
    struct sockaddr_in serveraddr;
    char *servername;
    char buf[256];
    socklen_t addr_size;
    int sockfd;

    sockfd=socket(AF_INET,SOCK_STREAM,0);
    bzero(&serveraddr,sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(11378);
    servername=gethostbyname("localhost");
    inet_pton(AF_INET,servername,&serveraddr.sin_addr);

    addr_size=sizeof(serveraddr);
    if(connect(sockfd,(struct sockaddr *)&serveraddr,addr_size)==-1)
    {
        perror("connect");
        exit(1);
    }

    byte_count = recv(sockfd, buf, sizeof buf, 0);
    printf("recv()'d %d bytes of data in buf\n", byte_count);

    close(sockfd);
}

早期的帮助将不胜感激。谢谢。

4

4 回答 4

3
sockfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&serveraddr,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(7400);
inet_pton(AF_INET,servername,&serveraddr.sin_addr); // here

你正在传递servernameinet_pton()但它没有被初始化!所以inet_pton()会失败。你应该检查它的返回值。

servername=gethostbyname(); //here
addr_size=sizeof(serveraddr);

第二个问题是你没有gethostbyname()正确使用。看看manpage,你会看到它gethostbyname()是带参数的,它返回一个指向 a 的指针struct hostent,而不是char像你做的那样的指针。您的编译器不会对此发出警告,因为您不包含netdb.h.

你应该检查你正在使用的所有函数的返回值,这样可以避免这样的问题。您应该启用编译器的一些标志(就像问题评论中所说的那样, -W -Wextra -Wall -pedantic是非常棒的标志)。

于 2013-08-28T13:36:55.083 回答
3

检查端口。服务器端口是 7400,但客户端尝试使用端口号 11378 进行连接,因此只有连接被拒绝。

于 2014-02-05T05:12:07.683 回答
1

确保在您的程序中包含 errno.h。任何失败后在程序中
添加行 。printf("%s", strerr(errno));任何系统调用失败都会设置正确的 errno,从而可以轻松诊断问题。

于 2014-05-02T18:27:16.387 回答
0

那么,您必须确保您的服务器正在运行并在正确的端口(7400)上侦听。只需检查:“netstat -tanp”是否在端口 7400 上侦听,然后尝试连接。

于 2013-08-28T13:39:13.337 回答