客户端未与服务器C连接(套接字编程)

时间:2015-05-26 08:17:12

标签: c sockets

我有一个非常简单的客户端和服务器代码:

客户端

int sockfd = 0;
    int bytesReceived = 0;
    char recvBuff[BUFSIZE];
    memset(recvBuff, '0', sizeof(recvBuff));
    struct sockaddr_in serv_addr;
    printf("here i am\n");
    /* Create a socket first */
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0){
        printf("\n Error : Could not create socket \n");
        return 1;
    }
    fprintf(stderr, "connection stats\n");
    fprintf(stderr, "connecting to %d - %s \n",port,server);
    /* Initialize sockaddr_in data structure */
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(port); // port
    serv_addr.sin_addr.s_addr = server;
    printf(" attempting connection %s:%d\n", server, port);
    /* Attempt a connection */
     int con =  connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
     printf("Error %d\n", con);
    exit(-1);

和服务器

   int listenfd = 0;
    int connfd = 0;
    struct sockaddr_in serv_addr;
    char sendBuff[BUFSIZE];
    int numrv;

    listenfd = socket(AF_INET, SOCK_STREAM, 0);

    printf("Socket retrieve success\n");

    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff));
    printf("here 2\n");
    serv_addr.sin_family = AF_INET;
    printf("here 3\n");
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    printf("here 4\n");
    serv_addr.sin_port = htons(port);
    printf("here 5\n");
    int optval = 1;
    printf(" opening port %d\n", port);
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,
               (const void *) &optval, sizeof(int));
    bind(listenfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
    printf("binded\n");


    while (1) {
        connfd = accept(listenfd, (struct sockaddr *) NULL, NULL);
        printf("connfd %d", connfd);


        close(connfd);
        sleep(1);


    }

客户端输出:

here i am
connecting to 8888 - localhost 
 attempting connection localhost:8888

服务器输出

Socket retrieve success
here 2
here 3
here 4
here 5
 opening port 8888
binded

经过几分钟的等待......我观察到以下情况: 客户端:

here i am
connecting to 8888 - localhost 
 attempting connection localhost:8888
Error -1

服务器:

Socket retrieve success
here 2
here 3
here 4
here 5
 opening port 8888
binded
connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd 

以-1为单位,我可以猜测连接失败了。 我不确定我错过了什么?

1 个答案:

答案 0 :(得分:2)

在调用listen()之前,服务器未在绑定套接字上调用accept()

也是这个

serv_addr.sin_addr.s_addr = server;

应该由编译器发出警告。你不能分配一个C - &#34;字符串&#34; (我认为server是)in_addr_tserv_addr.sin_addr.s_addr是什么)。

通过执行以下操作来解决此问题:

serv_addr.sin_addr.s_addr = inet_addr(server);

或者更好地为此添加错误检查,如下所示:

{
  in_addr_t in_addr = inet_addr(server);
  if (INADDR_NONE == in_addr)
  {
    perror("inet_addr() failed");
    abort(); /* or whatever error handling you choose. */
  }

  serv_addr.sin_addr.s_addr = in_addr;
}