[英]IPC using Unix Domain Sockets
我有兩個不同的應用程序,其中一個必須將數據饋入另一個。 我正在使用Unix域套接字在它們之間進行通信。 客戶端掛接到套接字,檢查服務器連接,如果可用則發送數據。 服務器等待客戶端連接,只要有可用數據,它就會讀取數據並將其寫入文件。 客戶端的主要功能是:
CLIENT:
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Usage: Operating_Mode Path_to_DAQ_dataset output_file cudaBF\n");
printf("Operating_Mode = 0 : Real Time BF processing\nUsage: Operating_Mode output_file cudaBF\n");
printf("Operating_Mode = 1 : Pre-recorded data BF processing\nUsage: Operating_Mode Path_to_DAQ_dataset output_file cudaBF\n");
return 1;
}
/*******************************************/
int s, len , packetTransferCount;
struct sockaddr_un remote;
if ((s = socket(AF_UNIX,SOCK_STREAM, 0)) == -1) {
perror("socket");
}
remote.sun_family = AF_UNIX;
strcpy(remote.sun_path, SOCKET_DISPLAY_PATH);
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
/*******************************************/
pthread_t threadBF;
struct beamRecordedArgs processParams;
processParams.dataPath = argv[2];
processParams.bfOutputFile = argv[3];
pthread_create(&threadBF,NULL,beamProcessRecorded,(void *)&processParams);
packetTransferCount = 0;
while(processStatus != COMPLETE){
if(processStatus == TRANSFER){
printf("Checking for display...\n");
if (connect(s, (struct sockaddr *)&remote, len) == -1) {
printf("No display process found\n");
processStatus = PROCESS;
}
else{
printf("Display process found.. Transferring packet\n");
send(s, txPackDisp, sizeof(txPackDisp), 0);
close(s);
processStatus = PROCESS;
printf("PACKETS TRANSFERRED : %d\n",++packetTransferCount);
}
}
else{
while(processStatus == PROCESS){
//sleep(1);
}
}
}
pthread_join(threadBF,NULL);
return 0;
}
對於服務器:
SERVER:
int main(void)
{
int dispSock, lenSock, packetTransferCount;
struct sockaddr_un localDisp;
if ((dispSock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(-1);
}
localDisp.sun_family = AF_UNIX;
strcpy(localDisp.sun_path, SOCKET_DISPLAY_PATH);
unlink(localDisp.sun_path);
lenSock = strlen(localDisp.sun_path) + sizeof(localDisp.sun_family);
if (bind(dispSock, (struct sockaddr *)&localDisp, lenSock) == -1) {
perror("bind");
exit(-1);
}
if (listen(dispSock, 5) == -1) {
perror("listen");
exit(-1);
}
packetTransferCount = 0;
do{
struct sockaddr_un remoteDisp;
int dispSockCon,dispConn;
dispConn = sizeof(remoteDisp);
if ((dispSockCon = accept(dispSock, (struct sockaddr *)&remoteDisp, &dispConn)) == -1) {
perror("accept");
exit(-1);
}
printf("Connected.\n");
int status = recv(dispSockCon, &rxPack, PACKET_SIZE*sizeof(float),0);
if (status != -1){
FILE *fp;
fp = fopen("bfo_sock","w");
fwrite(rxPack, PACKET_LENGTH, sizeof(float), fp);
fclose(fp);
}
else{
printf("Error in receiving packets\n");
}
close(dispSockCon);
}while(1);
close(dispSock);
unlink(SOCKET_DISPLAY_PATH);
return 0;
}
我面臨的問題是,客戶端只能在連接到服務器后發送一個數據包(先啟動還是已經運行的無關緊要的問題),之后客戶端甚至根本無法檢測到服務器進程。運行和其他進程可以檢測到它。通常,一次傳輸的數據大小大約為13.3 KB。 我在終端上看到的打印輸出是:
Number of packets to be processed in BF : 60
PACKETS PROCESSED : 1
Checking for display...
Display process found.. Transferring packet
PACKETS TRANSFERRED : 1
PACKETS PROCESSED : 2
Checking for display...
No display process found
PACKETS PROCESSED : 3
Checking for display...
No display process found
如果有人可以指出我要去哪里的地方,那對我真的很有幫助,因為我對使用套接字的IPC相當陌生。
好吧,我在這里找到了問題。 問題是,每次我要傳輸數據包並在此之后關閉它時,都需要重新創建套接字連接。 因此,服務器的main保持不變,但是客戶端現在變為:
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Usage: Operating_Mode Path_to_DAQ_dataset output_file cudaBF\n");
printf("Operating_Mode = 0 : Real Time BF processing\nUsage: Operating_Mode output_file cudaBF\n");
printf("Operating_Mode = 1 : Pre-recorded data BF processing\nUsage: Operating_Mode Path_to_DAQ_dataset output_file cudaBF\n");
return 1;
}
int packetTransferCount;
pthread_t threadBF;
struct beamRecordedArgs processParams;
processParams.dataPath = argv[2];
processParams.bfOutputFile = argv[3];
pthread_create(&threadBF,NULL,beamProcessRecorded,(void *)&processParams);
packetTransferCount = 0;
while(processStatus != COMPLETE){
if(processStatus == TRANSFER){
/****************************************************************/
/*This part was outside the loop, moving it inside creates a new
socket connector everytime I was to transfera packet and I close it before
the loops ends */
int s, len;
struct sockaddr_un remote;
if ((s = socket(AF_UNIX,SOCK_STREAM, 0)) == -1) {
perror("socket");
}
remote.sun_family = AF_UNIX;
strcpy(remote.sun_path, SOCKET_DISPLAY_PATH);
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
/****************************************************************/
printf("Checking for display...\n");
int dispConStatus = connect(s, (struct sockaddr *)&remote, len);
if ( dispConStatus == -1) {
printf("No display process found\n");
processStatus = PROCESS;
}
else{
printf("Display process found.. Transferring packet\n");
send(s, txPackDisp, sizeof(txPackDisp), 0);
processStatus = PROCESS;
printf("PACKETS TRANSFERRED : %d\n",++packetTransferCount);
}
close(s);
}
else{
while(processStatus == PROCESS){
//sleep(1);
}
}
}
pthread_join(threadBF,NULL);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.