2012-05-16 22 views
0

我想在本地主機上的Ubuntu 11.04中實現TCP回顯服務器和客戶端程序。但是,我陷入了綁定功能。 這是我的代碼。TCP回顯服務器中的綁定錯誤

TCPSERVER

#include<sys/types.h> 
#include<sys/socket.h> 
#include<netinet/in.h> 
#include<arpa/inet.h> 
#include<string.h> 
#include<stdio.h> 
#include<stdlib.h> 

struct sockaddr_in serv_addr,cli_addr; 
int listenfd,r,w,connfd,val,cli_addr_len; 
unsigned short serv_port=30000; 
char serv_ip[]="127.0.0.1"; 
char rbuff[128]; 
char sbuff[128]; 

int main() 
{ 
    bzero(&serv_addr,sizeof(serv_addr)); 
    serv_addr.sin_family=AF_INET; 
    serv_addr.sin_port=htons(serv_port); 
    inet_aton(serv_ip,(&serv_addr.sin_addr)); 
    printf("\nTcp Echo server.\n"); 
    //creating socket 

    if(listenfd=socket(AF_INET,SOCK_STREAM,0)<0) 
    { 
     printf("\nServer Error:Cannot create socket.\n"); 
     exit(1); 
    } 
    if(bind(listenfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr))<0) 
    { 
     printf("\nServer Error:cannot Bind.\n"); 
     close(listenfd); 
     exit(1); 
    } 
    if((listen(listenfd,5))<0) 
    { 
     printf("\nServer Error:Cannot listen.\n"); 
     close(listenfd); 
     exit(1); 
    } 
    cli_addr_len=sizeof(cli_addr); 
    for(;;) 
    { 
     printf("\nServer:listening for clients.... Press Control +C to stpo echo server :\n"); 
     if((connfd=accept(listenfd,(struct sockaddr*)&cli_addr,&cli_addr_len))<0) 
     { 
      printf("\nServer Error:Cannot accept client connections.\n"); 
      close(listenfd); 
      exit(1); 
     } 
     printf("\nServer:connection from client %s accepted.\n",inet_ntoa(cli_addr.sin_addr)); 
     if((r=read(connfd,rbuff,128))<0) 
      printf("\nServer Error:Cannot receive message from client.\n"); 
     else 
     { 
      rbuff[r]='\0'; 
      if((w=write(connfd,rbuff,128))<0) 
       printf("\nServer Error:cannot send message to the client.\n"); 
      else 
       printf("Echoed back %s to %s.\n",rbuff,inet_ntoa(cli_addr.sin_addr)); 
     } 
    } 
} 

在Ubuntu的GCC編譯我得到綁定error..I上傳只因爲我沒有得到任何錯誤我和需要幫助整個代碼之後。

+0

使用'perror'到在你的失敗路徑中打印出實際的錯誤消息而不是簡單的'printf'。 – Mat

+0

我用perror,它說「非插座上的插座錯誤」 –

回答

1

略低於代碼的錯誤:

if(listenfd=socket(AF_INET,SOCK_STREAM,0)<0) 
{ 
    printf("\nServer Error:Cannot create socket.\n"); 
    exit(1); 
} 

「=」 的優先級比 「<」 下,修改如下,你計劃將確定:

if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0) 
{ 
    printf("\nServer Error:Cannot create socket.\n"); 
    exit(1); 
} 
+0

謝謝你!有效 !! –

+0

...這就是爲什麼在if語句參數中嵌套賦值是一種邪惡的做法。 –