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

时间:2013-08-28 13:25:29

标签: c sockets unix client-server

我是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 个答案:

答案 0 :(得分: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

您已将servername传递给inet_pton(),但未初始化!所以inet_pton()会失败。你应该检查它的返回值。

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

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

您应该检查您正在使用的所有功能的返回值,它可以避免这样的问题。你应该启用编译器的一些标志(比如 alk 在问题评论中说, -W -Wextra -Wall -pedantic 是非常好的标志)。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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