2012-09-25 66 views
1

最近我讀一些基本的關於用C Socket編程,並以實踐這個基本知識,我試着寫一個PROGRAMM,剛剛應該做用戶和IRC服務器,之間的對話的一點點。IRC通信詳細

下面是相關代碼:

初始化通信插座:

void init(char *s[]) 
{ 
    struct sockaddr_in server; 
    printf("%s : connect . . .\n",s[0]); 
    server.sin_family = AF_INET; 
    inet_pton(AF_INET,s[1],&server.sin_addr.s_addr); 
    server.sin_port = htons(atoi(s[2])); 
    if((sock = socket(AF_INET,SOCK_STREAM,0))!= 0) 
     printf("%s : socket succesfully initialized.\n",s[0]); 
    if(connect(sock,(struct sockaddr *)&server,sizeof(server))==0) 
     printf("%s : succesfully connected.\n",s[0]); 
} 

發送消息:

void putmessage(char *s) 
{ 
    write(sock,s,sizeof(s)); 
} 

/*--------*/ 
(...) 
    do 
    { 
     scanf("%s",input); 
     putmessage(strcat(input,"\r\n")); 
    }while(strcmp(input,"quit")); 
(...) 

接收Messagges:

char *getmessage(void) 
{ 
    int i,t = 0; 
    char *p1,*p2; 
    p1 = malloc(sizeof(*p1)); 
    *p1 = '\0'; 
    p2 = malloc(sizeof(*p2)); 
    *p2 = '\0'; 
    do 
    { 
     i = read(sock,buf,BUFSIZE-1); 
     buf[i] = '\0'; 
     t += i+1; 
     p2 = malloc(t); 
     strcpy(p2,p1); 
     strcat(p2,buf); 
     free(p1); 
     p1 = p2; 
    }while(i == BUFSIZE-1); 
    return p1; 
} 

我在分流過程中使用一個用於接收和一個用於發送的過程中,它只是無限地調用。 通信工程基本上,因爲郵件我從不同的IRC服務器我試圖獲得(irc.quakenet.org,irc.debain.org/COM)總是errormessages與我發送的消息,說我想念參數。

現在的問題是:爲什麼可以通過Telnet客戶端連接到這些IRC網絡正常,但不能使用相同的消息(PASS,NICK,USER)我自己的代碼。什麼東西對我來說很重要,比如編碼(gcc通常使用哪種編碼?)?

的PROGRAMM的Ubuntu 12.04下運行。如果您需要更多信息,請詢問。

+1

當然,向你報告的「缺失參數」錯誤應該告訴你你錯過了什麼?否則是指IRC協議,它應該告訴你如何構建消息...... – Nim

+0

我閱讀了兩個相關的RFC,而且我的消息與我自己的代碼以及用於測試的telnet客戶端完全相同。在telnet客戶端上,它的工作原理和我自己的代碼都沒有,因此我沒有得出結論:問題是連接,而不是所使用的消息的形式 – user1694911

回答

2

您的客戶端不發送您輸入的完整內容,因爲這樣你試圖在套接字文件描述符寫。

void putmessage(char *s) 
{ 
    write(sock,s,sizeof(s)); 
} 

操作sizeof是不是你想要在這種情況下使用,因爲你會送sizeof(char*)字節,指針的大小是什麼。

你應該使用類似strlen(s)代替。