2012-04-21 85 views
2

我正在學習套接字編程...我試圖創建一個程序,在該程序中,我在客戶端屏幕上輸入了一個句子,並將其傳輸到服務器,然後出現在終端上服務器正在運行....代碼是here .....(看到這個問題的第一個答案後,我意識到我的錯誤,並改變了sockfd1在read()函數中,以接受並使用了fork() ()在server.cpp中...但仍編無效)客戶端和服務器示例不工作

在client.cpp早些時候,我用fgets(clibuff,100,標準輸入),並把這個和寫(sockcli,clibuff, strlen(clibuff))在一個無限循環中,但沒有奏效...

,所以我決定把它只是一個語句工作,除去在for循環....但是這也沒有工作...

當我在兩個不同的命令行運行這些

他們都開始罰款(因爲兩個程序輸出0 x)...但當我在客戶端輸入任何東西,然後按回車...它不會出現在服務器窗口 ...代碼的相關部分是:

-------server.cpp----- 

int sockfd1; 
sockfd1=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
int x=bind(sockfd1, (sockaddr*)(&serv), sizeof(serv)); //serv is my sockaddr_in structure 
cout<<x<<endl; 
listen(sockfd1,5); 

listen(sockfd1,5); 
int y; 
for(;;) 
{ 
connfd=accept(sockfd1, &cliaddr, &siz);  

if((y=read(sockfd1, servbuff, 100))>0) //i changed sockfd1 here to connfd 
fputs(servbuff, stdout); 

} 



-----client.cpp------ 

char clibuff[100]; 
char line[100]; 

sockaddr_in cli; 
bzero(&cli, sizeof(cli)); 
cli.sin_family=AF_INET; 
inet_aton("127.0.0.1", &(cli.sin_addr)); 
cli.sin_port=htons(2289); 

int sockcli; 
sockcli=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
int x= connect(sockcli,(sockaddr*)&cli, sizeof(cli)); 
cout<<x<<endl; 

cin>>clibuff; 
write(sockcli, clibuff, strlen(clibuff)); 

return 0; 

我到底做錯了什麼?

+2

請在您的問題中內嵌您的代碼的相關部分。沒有這一點,只要該鏈接失效,你的問題對任何人都有價值。 – Mat 2012-04-21 17:55:00

+0

@Mat + 1'cos我附上你的評論給我的嘗試,讓它發生。 – 2012-04-21 18:30:26

+1

加fflush(stdout);後fputs()它 – Corwin 2012-04-22 19:35:21

回答

2

您正在監聽套接字。你不應該那樣做。

'connfd'是服務器爲新連接的客戶端的客戶端套接字 - 它是您應該讀取/寫入該客戶端的套接字。通常以'connfd'作爲參數創建一個新線程,以便每個客戶端都可以獨立處理。

閱讀接受()。

+0

以及我改變sockfd1裏面的read()以connfd和也使用後()accept()函數...()仍然服務器不輸出我的輸入 – avinash 2012-04-21 18:20:37

+0

accept()返回客戶端連接嗎?當你在下一行放置一個斷點時會發生什麼?此外,請在您的問題中內嵌您的代碼的相關部分。沒有這一點,只要該鏈接失效,你的問題對任何人都有價值。 – 2012-04-21 18:29:18

+0

是接受返回一個非負數?...是在您的機器上工作的代碼? – avinash 2012-04-22 05:03:50