在客户端连接调用unix socket编程

时间:2017-04-12 08:32:27

标签: c sockets tcp network-programming ip

我是Unix网络的新手,我无法理解我的代码有什么问题。我已经研究了很多,逻辑上代码应该可以工作,但我现在正在把头发拉出来。客户端连接调用不断引发错误 - 将errno设置为22。我不明白连接参数的方式有什么问题。

客户端代码是:

#include <netinet/in.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdint.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[])
{

    char buffer[256];
    uint32_t
    serverip=; //ip goes here

    struct sockaddr_in clientsock;
    memset(&clientsock, 0, sizeof(clientsock));
    clientsock.sin_family = AF_INET;
    clientsock.sin_addr.s_addr = htonl(serverip);
    clientsock.sin_port = htons((unsigned short) 5000);
    socklen_t clientsocksize = sizeof(clientsock);
    int clientfd = socket(AF_INET, SOCK_STREAM, 0);
    int retval = -1;

    retval = connect(clientfd, (struct sockaddr*) &clientsock,
            sizeof(struct sockaddr_in));

    while (1)
    {
        if (retval == -1)
        {
            printf("error while connecting...\n");
            printf("error: %i\n", errno);
            retval = connect(clientfd, (struct sockaddr*) &clientsock,
                    sizeof(struct sockaddr_in));
        }
        else if (retval == 0)
        {
            printf("connection returned: %i\n", retval);
            printf("please enter data: ");
            bzero((char *) &buffer, sizeof(buffer));
            fgets(buffer, 255, stdin);
            write(clientfd, buffer, sizeof(buffer));
        }
        else
        {
            printf("error in else: %i\n", errno);

        }
    }
}

任何指导和批评都将不胜感激。

1 个答案:

答案 0 :(得分:0)

Errno 22是EINVAL,这意味着您传递给connect的一些参数无效。可能的错误之一是您将sockaddr设置为分配给uint32_t

uint32_t serverip=; //ip goes here
clientsock.sin_addr.s_addr = htonl(serverip);

什么是serverip?你怎么得到的?通常,您应该调用getaddrinfoinet_pton将主机名或点缀的ip字符串转换为sockaddr.sin_addr。例如,如果您使用getaddrinfo,则可以使用它直接返回的sockaddr

connect(clientfd, res->ai_addr, res->ai_addrlen);

或者如果您使用inet_pton

inet_pton(AF_INET, ipstr, &clientsock.sin_addr.s_addr);

此外,检查socket任何错误的返回值最好:

int clientfd = socket(AF_INET, SOCK_STREAM, 0);
if (clientfd < 0) {
      // error
      exit(1);
}