通过send()recv(),Socket编程,C发送多个消息

时间:2010-11-13 12:43:17

标签: c sockets send recv

我正在尝试创建一个程序(客户端),可以根据用户的请求向服务器发送消息。剥离代码如下:

客户端:

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

  struct sockaddr_in servaddr;
  int sock = socket(AF_INET, SOCK_STREAM, 0);

  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(6789);
  servaddr.sin_addr.s_addr = inet_addr(<ip_address_of_server>);

  while(1) {

    char message[161];
    fgets(message, 161, stdin);

    /* Replacing '\n' with '\0' */
    char *tmp = strchr(message, '\n');
    if (tmp) *tmp = '\0';

    connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr));
    send(sock, message, strlen(message), 0);
    close(sock);
  }
}

服务器:

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

  struct sockaddr_in servaddr;  
  int sock = socket(AF_INET, SOCK_STREAM, 0);

  memset(&servaddr, 0, sizeof(servaddr));
  servaddr.sin_family = AF_INET;
  servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servaddr.sin_port = htons(6789);

  bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr));  
  listen(sock, 5);

  while(1) {
    int clisock = accept(sock, (struct sockaddr *) NULL, NULL);

    if (clisock >= 0) {
      int messageLength = 160;
      char message[messageLength+1];
      int in, index = 0, limit = messageLength;

      while ((in = recv(clisock, &message[index], messageLength, 0)) > 0) {
        index += in;
        limit -= in;
      }

      printf("%s\n", message);
    }

    close(clisock);
  }
}

现在,这适用于我发送的第一条消息。但是它无法建立另一个连接(我在尝试连接客户端程序时收到错误消息“Bad file descriptor”。)任何人都能看到我误解的内容吗?谢谢:))

3 个答案:

答案 0 :(得分:2)

问题是您正在关闭侦听套接字sock,而不是客户端套接字clisock

答案 1 :(得分:2)

您的客户端程序也会犯同样的错误,第一次打开套接字但第一次连接完成后关闭套接字,所以下次循环时套接字描述符无效,需要重新打开套接字,但缺少,请从顶部删除套接字调用,并在while循环的开头添加以下行

int sock = socket(AF_INET,SOCK_STREAM,0);

答案 2 :(得分:2)

servaddr.sin_addr.s_addr = inet_addr(<ip_address_of_server>);

而不是客户端代码中的上述行使用以下

inet_pton(AF_INET,"<ipofserver>",&servaddr.sin_addr);

也对fllowing功能执行错误检查。