套接字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); } };
在ServerSocket\u绑定更改中: addr.sinu端口=端口 到 地址SINU port=htons(端口) 它应该会起作用。另外,使用strace调试系统调用(或libc的ltrace),如: strace-f./a.out套接字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.
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);