send()在非套接字上的套接字操作

3
在实现服务器和客户端时,我发现客户端正在将内容写入stdout而不是通过网络。我发现connect()返回的文件描述符总是为零,这就解释了为什么它会写入stdout。但我无法弄清楚为什么connect()总是返回零而不是有效套接字。我找到的所有网上文章都是由于在connect()调用周围放置if()的优先级问题引起的。但我没有这样做,请帮忙解决。
服务器代码
 int setUpServer(struct fuzzerObj *ptr, int *firstClient)
 {
     /* Declarations */
    int hostSocket, yes = 1, rtrn, clientfd;

    union
    {
        struct sockaddr_in in;

    }address;

    /* Create Socket */
    hostSocket = socket(AF_INET, SOCK_STREAM, 0);
    if(hostSocket < 0)
    {
        errorHandler("Could not create socket\n", FUNCTION_ID_SET_UP_SERVER);
        return -1;
    }

    /* Reuse Address */
    rtrn = setsockopt(hostSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
    if(rtrn < 0)
    {
        errorHandler("Couldn't Reuse Address\n", FUNCTION_ID_SET_UP_SERVER);
        return -1;
    }

    /* Set Up Struct */
    address.in.sin_len = sizeof(address.in);
    address.in.sin_family = AF_INET;
    address.in.sin_port = htons(BBPORT_NUMBER);
    address.in.sin_addr.s_addr = htonl(INADDR_ANY);
    memset(address.in.sin_zero, 0, sizeof(address.in.sin_zero));

    /* Bind Address to Socket */
    rtrn = bind(hostSocket, (struct sockaddr*) &address, address.in.sin_len);
    if(rtrn < 0)
    {
        errorHandler("Can't Bind Address to Socket\n", FUNCTION_ID_SET_UP_SERVER);
        return -1;
    }

    /* listen */
    rtrn = listen(hostSocket, ptr->numberOfClients);
    if(rtrn < 0)
    {
        errorHandler("Can't Listen\n", FUNCTION_ID_SET_UP_SERVER);
        return -1;
    }

    while(1)
    {
        rtrn = acceptClient(hostSocket, &clientfd);
        if(rtrn < 0)
        {
            printf("Can't Accept Client\n");
            return -1;
        }
        break;
    }
    *firstClient = clientfd;
    return 0;
 }

客户端代码。
 #include <CoreFoundation/CoreFoundation.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <stdbool.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <errno.h>

 #define BLACKBOX_PORT 9696

 int main(int argc, char *argv[])
 {
     /* Check To See If an argument was passed */
     if(argc < 2)
     {
         printf("No enough Arguments\n");
         return -1;
      }

     /* Declaration's */
    const char *ip = argv[1];
    int sockfd, fd, rtrn;
    char *outBuf;
    struct sockaddr_in servaddr;

    /* Get Socket to Connect to Fuzz Server */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0)
    {
        perror("Can't Create Socket");
        return -1;
    }

    /* Fill Out Struct */
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(BLACKBOX_PORT);
    inet_pton(AF_INET, ip, &servaddr.sin_addr);

    /* Attempt Connection */
    fd = connect(sockfd,(struct sockaddr *)&servaddr, sizeof(servaddr));
    if(fd < 0)
    {
        perror("Can not connect to BlackBox Fuzz server");
        return -1;
     }

     /* Allocate Space in Memory for Outgoing Connection */
     rtrn = asprintf(&outBuf, "Mac OSX 10.9\n");
     if(rtrn < 0)
     {
         perror("Copy Error");
         return -1;
     }

     /* Send Data to Fuzzer via Socket */
     rtrn = send(fd, outBuf, strlen(outBuf), 0);
     if(rtrn < 0)
     {
          perror("Can't write Data to BlackBox Server");
          return -1;
     }
     free(outBuf);

     return 0;
  }
1个回答

5
成功调用connect()后,sockfd将连接。返回值0表示调用成功。如果返回值不是0,则表示出现错误,连接尝试失败或尚未完成(如果connect是非阻塞的)。
确定connect()已成功后,请在sockfd上调用send(),而不是调用connect()的返回值。
     rtrn = send(sockfd, outBuf, strlen(outBuf), 0);

很酷,我想我一直认为connect()像accept()一样,应该读一下手册。 - 2trill2spill
1
accept()使用未连接的绑定套接字来表示监听器。以这种方式使用套接字的副作用是给您提供了一个可轮询的句柄,以异步确定客户端是否正在尝试连接。然后,accept()返回一个新的套接字来表示新建立的连接,使监听器套接字保持不变,以便它可以继续服务其目的。 - jxh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接