C的套接字编程(客户端服务器示例)

时间:2022-09-06 21:37:09

I am completely new to programming in unix and have written the following code for client and server programming. When I try to run the client code it says "Connection refused". Could somebody please tell me what could be the reason of it.

我对unix编程完全陌生,并且编写了下面的客户机和服务器编程代码。当我试图运行客户机代码时,它说“连接拒绝”。有人能告诉我原因吗?

Server Code :

服务器代码:

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

Client Code :

客户机代码:

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

An early help would be appreciated. Thanks.

希望早日得到帮助。谢谢。

4 个解决方案

#1


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

You're passing servername to inet_pton() but it is not initialized ! So inet_pton() will fail. You should check its return value.

您将servername传递给inet_pton(),但是它没有初始化!因此inet_pton()将会失败。您应该检查它的返回值。

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

The second problem is that you're not using gethostbyname() correctly.Take a look at the manpage, you will see that gethostbyname() is taken arguments and it returns a pointer to a struct hostent, not a pointer to char like you did. Your compiler doesn't warn you about this because you don't include netdb.h.

第二个问题是,您没有正确使用gethostbyname()。看一下manpage,您会看到gethostbyname()被接受了参数,它返回一个指向struct的指针,而不是像您这样的一个指向char的指针。你的编译器没有警告你,因为你不包括netdb.h。

You should check the return values of all the functiond that you are using, it's avoid problems like that. You should enable some flags of your compiler (like alk said in the question comments, -W -Wextra -Wall -pedantic are really great flags).

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

#2


3  

check the port. server port is 7400 but the client try to connect with port number 11378 so only connection has been refused.

检查端口。服务器端口是7400,但是客户端尝试连接端口11378,所以只有连接被拒绝。

#3


1  

Make sure to include errno.h in your program.
Add line printf("%s", strerr(errno)); in your program after any failure. Any system call failure sets correct errno making it simple to diagnose the problem.

确保包含了errno。在您的程序。添加行printf(" % s ",strerr(errno));在你的程序失败后。任何系统调用失败都可以正确地设置错误,使诊断问题变得简单。

#4


0  

Well, you have to be sure that your server is running and listening on proper port (7400). Just check with: "netstat -tanp" if there is something listening on port 7400 and then try to connect.

嗯,您必须确保您的服务器正在运行并监听合适的端口(7400)。只要检查一下:“netstat -tanp”如果有什么监听端口7400,然后尝试连接。

#1


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

You're passing servername to inet_pton() but it is not initialized ! So inet_pton() will fail. You should check its return value.

您将servername传递给inet_pton(),但是它没有初始化!因此inet_pton()将会失败。您应该检查它的返回值。

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

The second problem is that you're not using gethostbyname() correctly.Take a look at the manpage, you will see that gethostbyname() is taken arguments and it returns a pointer to a struct hostent, not a pointer to char like you did. Your compiler doesn't warn you about this because you don't include netdb.h.

第二个问题是,您没有正确使用gethostbyname()。看一下manpage,您会看到gethostbyname()被接受了参数,它返回一个指向struct的指针,而不是像您这样的一个指向char的指针。你的编译器没有警告你,因为你不包括netdb.h。

You should check the return values of all the functiond that you are using, it's avoid problems like that. You should enable some flags of your compiler (like alk said in the question comments, -W -Wextra -Wall -pedantic are really great flags).

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

#2


3  

check the port. server port is 7400 but the client try to connect with port number 11378 so only connection has been refused.

检查端口。服务器端口是7400,但是客户端尝试连接端口11378,所以只有连接被拒绝。

#3


1  

Make sure to include errno.h in your program.
Add line printf("%s", strerr(errno)); in your program after any failure. Any system call failure sets correct errno making it simple to diagnose the problem.

确保包含了errno。在您的程序。添加行printf(" % s ",strerr(errno));在你的程序失败后。任何系统调用失败都可以正确地设置错误,使诊断问题变得简单。

#4


0  

Well, you have to be sure that your server is running and listening on proper port (7400). Just check with: "netstat -tanp" if there is something listening on port 7400 and then try to connect.

嗯,您必须确保您的服务器正在运行并监听合适的端口(7400)。只要检查一下:“netstat -tanp”如果有什么监听端口7400,然后尝试连接。