bzero在套接字编程中

时间:2015-09-06 19:11:14

标签: c sockets

我正在c中编写一个简单的客户端/服务器聊天程序。我不明白为什么一个程序有效,另一个没有。为客户端和服务器提供的程序如下所示。当我在两个代码中用bzero((char *)服务器,sizeof(服务器))替换bzero(&(server.sin_zero),8)时,会抛出“传输端点未连接”的错误。他们已经使用第二种方法实现了它,它适用于site

Client.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h> 
    #include <sys/socket.h>
    #include <netinet/in.h>

    int main()
    {
        struct sockaddr_in server;
        int s1;
        char message[500];

        server.sin_port = htons(5000);
        server.sin_addr.s_addr = inet_addr("127.0.0.1");
        server.sin_family = AF_INET;
        bzero(&(server.sin_zero),8); 
        s1 = socket(AF_INET,SOCK_STREAM,0);
        if(s1 == -1) {
            perror("socket not created\n");
            exit(1);
        }
        if(connect(s1,(struct sockaddr *)&server,sizeof(server)) == -1) {
            perror("not able to connect\n");
            exit(1);
        }

        int n = read(s1,message,500);
        if(n < 0) {
            perror("message not recieved\n");
            exit(1);
        }
        printf("%s\n",message);
        close(s1);
        return 0;

    }

这是服务器的程序。

  Server.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h> 
    #include <sys/socket.h>
    #include <netinet/in.h>

    int main()
    {
        struct sockaddr_in server,client;
        int s1,s2,len;
        char message[500];

        server.sin_port = htons(5000);
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_family = AF_INET;
        bzero(&(server.sin_zero),8); 
        s1 = socket(AF_INET,SOCK_STREAM,0);
        if(s1 == -1) {
            perror("socket not created\n");
            exit(1);
        }
        if(bind(s1,(struct sockaddr *)&server,sizeof(struct sockaddr)) == -1) {
            perror("socket not binded\n");
            exit(1);
        }
        if(listen(s1,5) == -1) {
            perror("unable to listen");
            exit(1);
        }
        len = sizeof(struct sockaddr_in);
        s2 = accept(s1,(struct sockaddr *)&client,&len);
        printf("connected");
        if(s2 == -1) {
            perror("unable to accept connection");
            exit(1);
        }
        strcpy(message,"you are connected");
        message[strlen(message)] = '\0';
        int n = write(s2,message,strlen(message));
        if(n < 0) {
            perror("message not sent\n");
            exit(1);
        }
        close(s1);
        close(s2);
        return 0;

    }

1 个答案:

答案 0 :(得分:3)

bzero(&(server.sin_zero),8)

仅将sin_zero数组清零。

bzero((char*)server,sizeof(server))
另一方面,

将整个struct归零,从而重置之前设置的值(如sin_port)。

最后,首先struct归零,然后初始化它(就像他们在site you referred to上做的那样;注意细节: - ))。