我有一个波束成形和信号处理系统,其中3个不同的独立进程可以分别启动,并且需要每隔几毫秒相互发送8MB的数据块。在这些过程中,我将UNIX流套接字用于IPC。我将块的接收方作为套接字服务器,将发送方作为客户端。每次发送方有要发送的数据时,发送方都会连接到服务器,将数据放在套接字上并断开连接。这可以完美地工作,但是由于发送方以很高的频率发送数据,因此我从套接字的“ connect()”函数中收到很多错误,如“无此类文件或目录”。我猜这是因为尚未从上次传输中释放套接字。
客户端功能:
int sockDAQ, len,respServer;
struct sockaddr_un remote;
int dispConStatus;
for( j=0;j<16;j++){
if ((sockDAQ = socket(AF_UNIX,SOCK_STREAM, 0)) == -1)
perror("socket");
remote.sun_family = AF_UNIX;
switch(*(daqNum))
{
case DAQ1 : strcpy(remote.sun_path, SOCKET_DAQ1_PATH);
break;
case DAQ2 : strcpy(remote.sun_path, SOCKET_DAQ2_PATH);
break;
case DAQ3 : strcpy(remote.sun_path, SOCKET_DAQ3_PATH);
break;
case DAQ4 : strcpy(remote.sun_path, SOCKET_DAQ4_PATH);
break;
case DAQ5 : strcpy(remote.sun_path, SOCKET_DAQ5_PATH);
break;
case DAQ6 : strcpy(remote.sun_path, SOCKET_DAQ6_PATH);
break;
case DAQ7 : strcpy(remote.sun_path, SOCKET_DAQ7_PATH);
break;
case DAQ8 : strcpy(remote.sun_path, SOCKET_DAQ8_PATH);
break;
}
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
dispConStatus = connect(sockDAQ, (struct sockaddr *)&remote, len);
if ( dispConStatus != -1) {
//printf("beamformer process found by %d.. Transferring packet\n",*(daqNum));
//printf("j : %d\n", j);
respServer = NOT_TERMINATE;
if ((send(sockDAQ, &respServer, sizeof(int), 0))==-1) perror("send");
if ((send(sockDAQ, &transfer_bytes, sizeof(int), 0))==-1) perror("send");
if ((send(sockDAQ, buf_1, transfer_bytes, 0))==-1) perror("send");
pthread_mutex_lock(&bfmutex);
printf("PACKETS TRANSFERRED %d FROM DAQ %d\n",++sentCount,*(daqNum));
pthread_mutex_unlock(&bfmutex);
}
else
printf("FAILED TO FIND BF FOR DAQ %d\n",*(daqNum));
}
如果尝试类似的操作,则连接一次服务器,然后继续发送数据包,由于“ connect()”函数每次都返回-1,因此它似乎在第一次传输后不起作用。
更新功能:
int sockDAQ, len,respServer;
struct sockaddr_un remote;
int dispConStatus;
if ((sockDAQ = socket(AF_UNIX,SOCK_STREAM, 0)) == -1)
perror("socket");
remote.sun_family = AF_UNIX;
switch(*(daqNum))
{
case DAQ1 : strcpy(remote.sun_path, SOCKET_DAQ1_PATH);
break;
case DAQ2 : strcpy(remote.sun_path, SOCKET_DAQ2_PATH);
break;
case DAQ3 : strcpy(remote.sun_path, SOCKET_DAQ3_PATH);
break;
case DAQ4 : strcpy(remote.sun_path, SOCKET_DAQ4_PATH);
break;
case DAQ5 : strcpy(remote.sun_path, SOCKET_DAQ5_PATH);
break;
case DAQ6 : strcpy(remote.sun_path, SOCKET_DAQ6_PATH);
break;
case DAQ7 : strcpy(remote.sun_path, SOCKET_DAQ7_PATH);
break;
case DAQ8 : strcpy(remote.sun_path, SOCKET_DAQ8_PATH);
break;
}
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
dispConStatus = connect(sockDAQ, (struct sockaddr *)&remote, len);
if ( dispConStatus != -1) {
respServer = NOT_TERMINATE;
if ((send(sockDAQ, &respServer, sizeof(int), 0))==-1) perror("send");
if ((send(sockDAQ, &transfer_bytes, sizeof(int), 0))==-1) perror("send");
if ((send(sockDAQ, buf_1, transfer_bytes, 0))==-1) perror("send");
pthread_mutex_lock(&bfmutex);
printf("PACKETS TRANSFERRED %d FROM DAQ %d\n",++sentCount,*(daqNum));
pthread_mutex_unlock(&bfmutex);
usleep(5000);
respServer = NOT_TERMINATE;
if ((send(sockDAQ, &respServer, sizeof(int), 0))==-1) perror("send");
if ((send(sockDAQ, &transfer_bytes, sizeof(int), 0))==-1) perror("send");
if ((send(sockDAQ, buf_1, transfer_bytes, 0))==-1) perror("send");
pthread_mutex_lock(&bfmutex);
printf("PACKETS TRANSFERRED %d FROM DAQ %d\n",++sentCount,*(daqNum));
pthread_mutex_unlock(&bfmutex);
}
close(sockDAQ);
这将在send()函数上返回错误:
../sysdeps/unix/sysv/linux/x86_64/send.c: No such file or directory.
我的问题是:
我是否需要在每次需要向套接字发送数据包时终止连接并重新连接。
有没有一种方法可以无限期地维护套接字连接,因为持续的连接和重新连接会导致系统中的大量延迟,并且我正在通过套接字丢弃数据包。
关于connect()函数返回“没有这样的文件或目录”错误,我是否可以假设发生这种情况,是因为内核在创建新连接之前没有从上次连接中释放套接字,还是我错过了一些东西。
帮助将不胜感激。谢谢。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句