gpt4 book ai didi

c++ - Unix 套接字循环

转载 作者:行者123 更新时间:2023-11-28 07:21:26 25 4
gpt4 key购买 nike

我正在尝试实现一对能够通过 Unix 套接字交换信息的服务器/客户端程序。问题是客户端在循环中不断地被服务器重置和重新运行,而且我在第一次向套接字发送数据/从套接字接收数据时遇到了麻烦。现在我有这样的东西:

服务器:

int main(int argc, char const *argv[]){
unix_socket server;
server.initSocket(DEFAULT_SOCKET_PATH,SERVER_MODE);
server.wait();

bool first=true;

for (int i = 0; i < 30; ++i)
{

//send & receive data

server.closeSocket();
first=false;
}

return 0;
}

客户:

int loop_controller(){
unix_socket client;
client.initSocket(DEFAULT_SOCKET_PATH,CLIENT_MODE);

// receive & send data

client.closeSocket();
}


int main () {

for (int i = 0; i < 30; ++i){
loop_controller();
}

return 0;
}

unix_socket 类的 initSocket()wait()closeSocket() 成员(模式 0对于服务器,模式 1 对于客户端):

void unix_socket::initSocket(const char* sock_path, const int sc_mode){

if (sc_mode==0){
if (mode != sc_mode) mode=sc_mode;
if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
//exit(1);
}
// ---

local.sun_family = AF_UNIX;
strcpy(local.sun_path, sock_path);
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
if (bind(sock, (struct sockaddr *)&local, len) == -1) {
close(sock);
perror("bind");
//exit(1);
}
// ---

} else if(sc_mode==1) {
if (mode != sc_mode) mode=sc_mode;

if ((client_sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
//exit(1);
}
// ---
remote.sun_family = AF_UNIX;
strcpy(remote.sun_path, sock_path);
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
if (connect(client_sock, (struct sockaddr *)&remote, len) == -1) {
perror("connect");
//exit(1);
}
// ---
} else printf("Invalid sc_mode argument: %d\n",sc_mode);
}
//...

void unix_socket::wait(){
if (mode==0){
if (listen(sock, 5) == -1) {
perror("listen");
//exit(1);
}
t = sizeof(remote);
if ((client_sock = accept(sock, (struct sockaddr *)&remote, &t)) == -1) {
perror("accept");
//exit(1);
}
} else printf("Invalid call to wait(): mode %d\n, must be 0",mode);
}
//...

void unix_socket::closeSocket(){
//close(sock);
close(client_sock);
}
//...

但是,当使用 Valgrind 运行这两个程序时,我收到 SIGPIPE 错误:

==5384== 
==5384== Process terminating with default action of signal 13 (SIGPIPE)
==5384== at 0x573DDA2: send (send.c:28)
==5384== by 0x405910: unix_socket::sendMsg(char, double) (in .../server)
==5384== by 0x405B6C: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in .../server)
==5384== by 0x402044: main (in .../server)
==5384==

我猜测在关闭/重新打开套接字时没有正确完成某些操作。什么是正确的程序?

最佳答案

在你的循环中,你只 accept()ing 一次。循环体的结尾表示客户端套接字已关闭,但它永远不会为下一次迭代再次 accept()ed。

你的循环应该是这样的:

server.startListening(); // bind, listen and friends

for (int i = 0; i < 30; i++) {
server.acceptClient(); // Call accept
// insert byte pushing routines here..
server.closeSocket(); // call close() on socket returned by accept()
}

关于c++ - Unix 套接字循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com