我正在編寫一個IRC bot在C中,並遇到了一個障礙。c recv()讀直到換行發生
在我的主要功能,我創建我的套接字和連接,所有的快樂的東西。然後我有一個(幾乎)無限循環來讀取從服務器發回的內容。然後我將所讀取的內容傳遞給幫助函數processLine(char *line)
- 問題是,下面的代碼讀取直到我的緩衝區已滿 - 我希望它只能讀取文本,直到出現換行符(\ n)或回車符(\ r) (從而結束了該行)
while (buffer[0] && buffer[1]) {
for (i=0;i<BUFSIZE;i++) buffer[i]='\0';
if (recv(sock, buffer, BUFSIZE, 0) == SOCKET_ERROR)
processError();
processLine(buffer);
}
什麼最終情況是,許多線路卡住都在一起,我不能正確處理線當這種情況發生。
如果你不熟悉IRC協議,簡要總結將是,當發送消息時,它往往是這樣的::[email protected] PRIVMSG #someChannel :The rest on from here is the message sent...
和登錄通知,例如,是這樣的::the.hostname.of.the.server ### bla some text bla
以# ##是用於處理的代碼(?) - 即372是以下文本是「每日消息」的一部分的指示符。
當它們全部卡在一起時,我無法知道哪一行是什麼數字,因爲我無法找到某一行開始或結束的位置!
我非常感謝您的幫助!
P.S .:這是在linux上編譯/運行的,但我最終希望將它移植到windows上,所以我儘可能多地利用它,因爲我可以使用多平臺。
P.S.S:這是我的ProcessLine從()代碼:
void processLine(const char *line) {
char *buffer, *words[MAX_WORDS], *aPtr;
char response[100];
int count = 0, i;
buffer = strdup(line);
printf("BLA %s", line);
while((aPtr = strsep(&buffer, " ")) && count < MAX_WORDS)
words[count++] = aPtr;
printf("DEBUG %s\n", words[1]);
if (strcmp(words[0], "PING") == 0) {
strcpy(response, "PONG ");
strcat(response, words[1]);
sendLine(NULL, response); /* This is a custom function, basically it's a send ALL function */
} else if (strcmp(words[1], "376") == 0) { /* We got logged in, send login responses (i.e. channel joins) */
sendLine(NULL, "JOIN #cbot");
}
}
看起來很簡單。但是,我將如何重新輸入recv()?我會傳遞一個字符指針到部分讀取文本的末尾,即如果recv()只讀取10個字符中的5個,而是將指針傳遞給第6個位置? – FurryHead 2011-05-22 20:45:24
@FurryHead:增加了一個(未經測試的)示例 – bdonlan 2011-05-22 20:52:54
哦,哇。我很久以前就放棄了這個項目,感覺大部分情況都在我的頭上(這是它的)。現在我終於回到了一個非常相似的項目(irc bot再次,但有點不同),我甚至沒有意識到這是我的線索通讀這一點。在過去的兩天裏,我一直把頭撞到桌子上,試圖實現這一點(幾乎和你寫的一樣),但奇怪的是,我最終只從一行中隨機選擇了一個角色。奇。無論如何,只是想再次感謝你!這非常有幫助! – FurryHead 2011-07-29 18:10:35