2011-03-30 73 views
1

我想在C插座之間運行2路通信。爲了建立套接字,我按照這個鏈接上的指示(http://www.linuxhowtos.org/C_C++/socket.htm),一切正常。從客戶端發送消息到服務器工作得很好。與C插座的雙向通信

但是,我還希望服務器能夠將響應消息發送回客戶端。這是如何完成的?如果我在兩端建立了客戶端和服務器連接,則其中一個不能綁定。

編輯更多代碼。目前,我已經使用這種套接字風格並將它們放入C++代碼中,只是因爲這是我的熟悉。忽略面向對象的問題。

//main call 
if (server) 
    { 
     Connection recv(true, "servername"); 
     recv.GetMsg(); 
     recv.SendMsg("test", 4); 
    } 
    else // client 
    { 
     Connection snd(false, "servername"); 
     snd.GetMsg(); 
     snd.SendMsg("this is a test", 14); 
    } 

和連接類中,

void SendMsg(char *msg, int msg_length) 
{ 
     send(some_socket, msg, msg_length, 0); 
}; 

void GetMsg() 
{ 
     recvd = recv(opponent_socket, buffer, sizeof(buffer), 0); 
     buffer[recvd] = '\0'; 
     cout << "Printing msg: " << buffer << endl; 
}; 

Connection::Connection(bool isserver, char *servername) 
{ 
    is_server = isserver; 
    server = servername; 
    opponent_socket = 0; 
    some_socket = socket(PF_INET, SOCK_STREAM, 0); 

    if (some_socket < 0) 
    { 
     cout << "Connection failed.\n" << endl; 
     exit(-1); 
    } 

    if (is_server) 
    { 
     AddrSetupServer(); // standard calls here. Pretty well what's shown in link provided 
     BindServer(); 
     ListenServer(); 
     WaitConnectionServer(); 
    } 
    else 
    { 
     AddrSetupClient(); 
     ConnectClient(); 
    } 
}; 

回答

2

一旦你有一個連接,它是雙向的;只需通過套接字發送您的響應。

+0

與客戶端代碼發送響應的方法完全相同嗎?當我嘗試時,我得到「破管」。 – watercha 2011-03-30 22:05:06

+0

而在另一個嘗試這種情況下,我得到了嘟garbage垃圾,而不是發送的消息。 – watercha 2011-03-30 22:07:02

+0

客戶是否閱讀回覆?如果它只是發送東西並關閉套接字/退出,當然你會遇到一個錯誤,試圖響應不存在的客戶端。另外,如果您將代碼添加到問題中,這將有所幫助。 – geekosaur 2011-03-30 22:09:31