套接字api在类内部不起作用 我试图在C++类中包Unix套接字API调用,以便更容易使用。我用C语言编写了一个简单的工作示例,并在一个类中复制了代码。从下面可以看到,无论我调用的是包装器代码的函数版本还是方法版本,代码都是相同的。请参见下面的临时代码: #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <errno.h> #include <stdio.h> #include <unistd.h> #include <string.h> static int sockfd; static int rec_sock; static int len; typedef struct sockaddr_in sockaddr_in; static sockaddr_in addr; static sockaddr_in recaddr; int ServerSocket_socket(int family, int type, int protocol) { sockfd = socket(AF_INET, SOCK_STREAM, 0) return sockfd; } void ServerSocket_bind(int port) { addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; addr.sin_port = port; bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); } void ServerSocket_printInfo(void) { len = sizeof(addr); getsockname(sockfd, (struct sockaddr *)&addr, (socklen_t *)&len); printf("ip = %s, port = %d\n", inet_ntoa(addr.sin_addr), (addr.sin_port)); } void ServerSocket_listen(int backlog) { listen(sockfd, backlog); } void ServerSocket_accept(void) { rec_sock = accept(sockfd, (struct sockaddr *)(&recaddr), (socklen_t *)&len); } void ServerSocket_printPeerInfo(void) { printf("remote machine = %s, port = %x, %x.\n", inet_ntoa(recaddr.sin_addr), recaddr.sin_port, ntohs(recaddr.sin_port)); memset(&recaddr, 0, sizeof(recaddr)); len = sizeof(addr); getpeername(rec_sock, (struct sockaddr *)&recaddr, (socklen_t *) &len); } void ServerSocket_write(void) { write(rec_sock, "hi, there", 10); sleep(20); exit(1); } struct ServerSocket { int socket(int family, int type, int protocol) { sockfd = socket(AF_INET, SOCK_STREAM, 0); return sockfd; } void bind(int port) { addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; addr.sin_port = port; ::bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); } void printInfo(void) { len = sizeof(addr); getsockname(sockfd, (struct sockaddr *)&addr, (socklen_t *)&len); printf("ip = %s, port = %d\n", inet_ntoa(addr.sin_addr), (addr.sin_port)); } void listen(int backlog) { ::listen(sockfd, backlog); } void accept(void) { rec_sock = ::accept(sockfd, (struct sockaddr *)(&recaddr), (socklen_t *)&len); } void printPeerInfo(void) { printf("remote machine = %s, port = %x, %x.\n", inet_ntoa(recaddr.sin_addr), recaddr.sin_port, ntohs(recaddr.sin_port)); memset(&recaddr, 0, sizeof(recaddr)); len = sizeof(addr); getpeername(rec_sock, (struct sockaddr *)&recaddr, (socklen_t *) &len); printf("remote machine = %s, port = %d, %d.\n", inet_ntoa(recaddr.sin_addr), recaddr.sin_port, ntohs(recaddr.sin_port)); } void write(void) { ::write(rec_sock, "hi, there", 10); sleep(20); exit(1); } };

套接字api在类内部不起作用 我试图在C++类中包Unix套接字API调用,以便更容易使用。我用C语言编写了一个简单的工作示例,并在一个类中复制了代码。从下面可以看到,无论我调用的是包装器代码的函数版本还是方法版本,代码都是相同的。请参见下面的临时代码: #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdlib.h> #include <errno.h> #include <stdio.h> #include <unistd.h> #include <string.h> static int sockfd; static int rec_sock; static int len; typedef struct sockaddr_in sockaddr_in; static sockaddr_in addr; static sockaddr_in recaddr; int ServerSocket_socket(int family, int type, int protocol) { sockfd = socket(AF_INET, SOCK_STREAM, 0) return sockfd; } void ServerSocket_bind(int port) { addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; addr.sin_port = port; bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); } void ServerSocket_printInfo(void) { len = sizeof(addr); getsockname(sockfd, (struct sockaddr *)&addr, (socklen_t *)&len); printf("ip = %s, port = %d\n", inet_ntoa(addr.sin_addr), (addr.sin_port)); } void ServerSocket_listen(int backlog) { listen(sockfd, backlog); } void ServerSocket_accept(void) { rec_sock = accept(sockfd, (struct sockaddr *)(&recaddr), (socklen_t *)&len); } void ServerSocket_printPeerInfo(void) { printf("remote machine = %s, port = %x, %x.\n", inet_ntoa(recaddr.sin_addr), recaddr.sin_port, ntohs(recaddr.sin_port)); memset(&recaddr, 0, sizeof(recaddr)); len = sizeof(addr); getpeername(rec_sock, (struct sockaddr *)&recaddr, (socklen_t *) &len); } void ServerSocket_write(void) { write(rec_sock, "hi, there", 10); sleep(20); exit(1); } struct ServerSocket { int socket(int family, int type, int protocol) { sockfd = socket(AF_INET, SOCK_STREAM, 0); return sockfd; } void bind(int port) { addr.sin_addr.s_addr = INADDR_ANY; addr.sin_family = AF_INET; addr.sin_port = port; ::bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); } void printInfo(void) { len = sizeof(addr); getsockname(sockfd, (struct sockaddr *)&addr, (socklen_t *)&len); printf("ip = %s, port = %d\n", inet_ntoa(addr.sin_addr), (addr.sin_port)); } void listen(int backlog) { ::listen(sockfd, backlog); } void accept(void) { rec_sock = ::accept(sockfd, (struct sockaddr *)(&recaddr), (socklen_t *)&len); } void printPeerInfo(void) { printf("remote machine = %s, port = %x, %x.\n", inet_ntoa(recaddr.sin_addr), recaddr.sin_port, ntohs(recaddr.sin_port)); memset(&recaddr, 0, sizeof(recaddr)); len = sizeof(addr); getpeername(rec_sock, (struct sockaddr *)&recaddr, (socklen_t *) &len); printf("remote machine = %s, port = %d, %d.\n", inet_ntoa(recaddr.sin_addr), recaddr.sin_port, ntohs(recaddr.sin_port)); } void write(void) { ::write(rec_sock, "hi, there", 10); sleep(20); exit(1); } };,c++,c,sockets,C++,C,Sockets,在ServerSocket\u绑定更改中: addr.sinu端口=端口 到 地址SINU port=htons(端口) 它应该会起作用。另外,使用strace调试系统调用(或libc的ltrace),如: strace-f./a.out ltrace./a.out服务器套接字绑定更改: addr.sinu端口=端口 到 地址SINU port=htons(端口) 它应该会起作用。另外,使用strace调试系统调用(或libc的ltrace),如: strace-f./a.out ltrace.

在ServerSocket\u绑定更改中:

addr.sinu端口=端口

地址SINU port=htons(端口)

它应该会起作用。另外,使用strace调试系统调用(或libc的ltrace),如:

strace-f./a.out


ltrace./a.out

服务器套接字绑定更改:

addr.sinu端口=端口

地址SINU port=htons(端口)

它应该会起作用。另外,使用strace调试系统调用(或libc的ltrace),如:

strace-f./a.out

ltrace./a.out

试试这个:

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

typedef struct sockaddr_in sockaddr_in; 

struct ServerSocket 
{ 
  int sockfd; 
  int rec_sock; 

  ServerSocket()
  {
    sockfd = -1; 
    rec_sock = -1; 
  }

  ~ServerSocket()
  {
    if (rec_sock != -1) closesocket(rec_sock); 
    if (sockfd != -1) closesocket(sockfd); 
  }

  void socket(int family, int type, int protocol) 
  { 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  } 

  void bind(int port) 
  { 
    sockaddr_in addr; 
    memset(&addr, 0, sizeof(addr)); 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 

    ::bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); 
  } 

  void printInfo(void) 
  { 
    sockaddr_in addr; 
    memset(&addr, 0, sizeof(addr)); 
    int len = sizeof(addr); 
    getsockname(sockfd, (struct sockaddr *)&addr, (socklen_t *)&len); 
    printf("ip = %s, port = %d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
  } 

  void listen(int backlog) 
  { 
    ::listen(sockfd, backlog); 
  } 

  void accept(void) 
  { 
    rec_sock = ::accept(sockfd, (struct sockaddr *)(&recaddr), (socklen_t *)&len); 
  } 

  void printPeerInfo(void) 
  { 
    sockaddr_in recaddr; 
    memset(&recaddr, 0, sizeof(recaddr)); 
    int len = sizeof(addr); 
    getpeername(rec_sock, (struct sockaddr *)&recaddr, (socklen_t *) &len); 
    printf("remote machine = %s, port = %d.\n", inet_ntoa(recaddr.sin_addr), ntohs(recaddr.sin_port)); 
  } 

  void write(void *data, int len) 
  { 
    ::write(rec_sock, (char*)data, len); 
  } 
}; 
试试这个:

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

typedef struct sockaddr_in sockaddr_in; 

struct ServerSocket 
{ 
  int sockfd; 
  int rec_sock; 

  ServerSocket()
  {
    sockfd = -1; 
    rec_sock = -1; 
  }

  ~ServerSocket()
  {
    if (rec_sock != -1) closesocket(rec_sock); 
    if (sockfd != -1) closesocket(sockfd); 
  }

  void socket(int family, int type, int protocol) 
  { 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
  } 

  void bind(int port) 
  { 
    sockaddr_in addr; 
    memset(&addr, 0, sizeof(addr)); 
    addr.sin_addr.s_addr = INADDR_ANY; 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 

    ::bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); 
  } 

  void printInfo(void) 
  { 
    sockaddr_in addr; 
    memset(&addr, 0, sizeof(addr)); 
    int len = sizeof(addr); 
    getsockname(sockfd, (struct sockaddr *)&addr, (socklen_t *)&len); 
    printf("ip = %s, port = %d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
  } 

  void listen(int backlog) 
  { 
    ::listen(sockfd, backlog); 
  } 

  void accept(void) 
  { 
    rec_sock = ::accept(sockfd, (struct sockaddr *)(&recaddr), (socklen_t *)&len); 
  } 

  void printPeerInfo(void) 
  { 
    sockaddr_in recaddr; 
    memset(&recaddr, 0, sizeof(recaddr)); 
    int len = sizeof(addr); 
    getpeername(rec_sock, (struct sockaddr *)&recaddr, (socklen_t *) &len); 
    printf("remote machine = %s, port = %d.\n", inet_ntoa(recaddr.sin_addr), ntohs(recaddr.sin_port)); 
  } 

  void write(void *data, int len) 
  { 
    ::write(rec_sock, (char*)data, len); 
  } 
}; 

谢谢这把它修好了。我会有所不同,看看我做了什么不同。谢谢。这把它修好了。我会区分,看看我做了什么不同。我在我真正的代码。为了简洁起见,我在帖子中删除了它。我在真实代码中删除了它。为了简洁起见,我在帖子中删除了它。谢谢你的回复。我将查看strace以备将来使用。因为我的客户端代码也没有改变端口到网络字节的顺序,据我所知,这不会是一个问题。我尝试了各种方法,对两端的端口号进行字节排序,但似乎都不起作用。感谢您的回复。我将查看strace以备将来使用。因为我的客户端代码也没有改变端口到网络字节的顺序,据我所知,这不会是一个问题。我尝试了各种方法,对两端的端口号进行字节排序,但似乎都不起作用。
ServerSocket sock;  
sock.socket(AF_INET, SOCK_STREAM, 0);  
sock.bind(1031);  
sock.printInfo();  
sock.listen(5);  
sock.accept();  
sock.printPeerInfo();  
sock.write("hi, there", 10);  
sleep(20);   
exit(1);