2015-02-11 31 views
1

我試圖用八度來接收數據並將數據發送回C++客戶端。它第一次運作。通過套接字在八度和C++程序之間發送數據

但是,如果我再次在同一個八度段會話中執行腳本。客戶端無法連接到八度。客戶端輸出:連接拒絕

倍頻腳本:

s=socket(); 
bind(s,12345); 
a=listen(s,5) 
b=accept(s) 
len=255; 
data=recv(b,len) 
zahl = 10+str2double(char(data)) 
sendDATEN = "Daten sind da" 
send(b,sendDATEN,MSG_WAITALL) 
disconnect(b) 

客戶端:

int main(int argc, char *argv[]) 
{ 
    int sockfd, portno, n; 
    struct sockaddr_in serv_addr; 
    struct hostent *server; 

    char buffer[256]; 
    if (argc < 3) { 
     fprintf(stderr,"usage %s hostname port\n", argv[0]); 
     exit(0); 
    } 
    portno = atoi(argv[2]); 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if (sockfd < 0) 
     error("ERROR opening socket"); 
    server = gethostbyname(argv[1]); 
    if (server == NULL) { 
     fprintf(stderr,"ERROR, no such host\n"); 
     exit(0); 
    } 
    bzero((char *) &serv_addr, sizeof(serv_addr)); 
    serv_addr.sin_family = AF_INET; 
    bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr, 
     server->h_length); 
    serv_addr.sin_port = htons(portno); 
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
     error("ERROR connecting"); 
    n = write(sockfd,"1.11231231",strlen("1.11231231")); 
    if (n < 0) 
     error("ERROR writing to socket"); 
    bzero(buffer,256); 
    n = read(sockfd,buffer,100); 
    if (n < 0) 
     error("ERROR reading from socket"); 
    printf("%s\n",buffer); 
    close(sockfd); 
    return 0; 
} 
+2

Octave看起來像是一直在監聽和等待連接的「服務器」。您的代碼片段(從'b = accept(s)'到'disconnect(b)')應該處於某種類型的循環中,以便它可以繼續接受連接。 看起來它正在執行一次腳本,然後完成執行 – KuramaYoko 2015-02-11 18:06:58

+0

連接被拒絕是一個清楚的跡象表明另一端(服務器在這裏)沒有在監聽,你可以通過以下命令驗證相同的命令:netstat -an | grep <你的端口號> – sanjayk79 2015-02-12 03:56:51

+0

如果你等幾分鐘,問題就消失了,然後嘗試重新運行Octave服務器端和clinet?然後這可能是一個SO_REUSEADDR丟失的問題 – Andy 2015-02-15 10:15:01

回答

0

看起來你不能結合,因爲地址已被使用。你還沒有回答我的問題,但我想你可以連接,如果你等待幾分鐘(檢查狀態與netstat!)

有一個octave插座https://github.com/octave-de/octave-sockets-enh它增加了SOL_SOCKET,SO_DEBUG和SO_REUSEADDR

相關問題