【问题标题】:Server not receiving message properly?服务器没有正确接收消息?
【发布时间】:2014-01-27 00:42:09
【问题描述】:

我是 C 网络的新手,我一直在尝试让服务器从客户端检索消息,但是写入消息仍然失败。当我做这个时,我基本上试图修改一个从服务器接收消息以发送它的程序。这是服务器代码。

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

#define PORTNUM 1887

int server() {
  char msg[101];

  struct sockaddr_in dest;
  struct sockaddr_in serv;
  int mysocket;
  socklen_t socksize = sizeof(struct sockaddr_in);

  memset(&serv, 0, sizeof(serv));

  serv.sin_family = AF_INET;
  serv.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
  serv.sin_port = htons(PORTNUM);

  mysocket = socket(AF_INET, SOCK_STREAM, 0); 
  bind(mysocket, (struct sockaddr *)&serv, sizeof(struct sockaddr));

  listen(mysocket, 2); 
  int consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
  int len;

  while (consocket) {
    printf("Incoming connection from %s - recieving welcome\n", inet_ntoa(dest.sin_addr));
    len = recv(mysocket, msg, 100, 0); 
    msg[len] = '\0';
    if (len > 0) printf("%s %d\n", msg, len);
    consocket = accept(mysocket, (struct sockaddr *)&dest, &socksize);
  }
  close(consocket);
  close(mysocket);
  return EXIT_SUCCESS;
}

int main() {
  return server();
}

这是客户端。

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


#define MAXREC 100
#define PORTNUM 1887

int getMessage() {
  char buffer[] = "Hello Fish!\n";
  int len, mysocket;
  struct sockaddr_in dest;

  mysocket = socket(AF_INET, SOCK_STREAM, 0);

  memset(&dest, 0, sizeof(dest));
  dest.sin_family = AF_INET;
  dest.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
  dest.sin_port = htons(PORTNUM);

  connect(mysocket, (struct sockaddr *)&dest, sizeof(struct sockaddr));
  printf("%s\n", buffer);
  write(mysocket,"45", strlen("45"));


  close(mysocket);
  return EXIT_SUCCESS;
}

int main() {
  return getMessage();
}

最初我尝试发送缓冲区消息,然后我转而尝试使用常量来查看是否有帮助。

【问题讨论】:

  • 请注意,标准 C 不了解网络。您可能在 Linux 或其他一些符合 Posix 的系统上。因此,请相应地标记您的问题。
  • 为什么你只在一条消息后循环调用accept?一个给定的 TCP 连接通常用于多个消息....
  • Deos 的“真实”代码也完全忽略了测试各种系统调用是否失败?
  • 另外,请仔细阅读read()/recv()/write()/send() 的手册页,并了解至少对于套接字,这些功能不一定是读/接收/写/发送尽可能多的字节,但很少。因此,循环计算此类调用,直到所有数据或终止符已被接收/发送是一个好主意,而不是说必不可少的必要性。
  • @BasileStarynkevitch 这不应该是一个完成的应用程序,我只是想弄清楚它是如何工作的,所以这个简单的程序只是发送一条消息

标签: c linux networking


【解决方案1】:
len = recv(mysocket, msg, 100, 0); 

在服务器上应该是

len = recv(consocket, msg, 100, 0); 

accept 返回新连接的句柄,因此您需要读取该句柄以获取客户端消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 2013-11-12
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多