我試圖做一個程序(客戶端)可以發送消息到服務器應用戶的請求。精簡的代碼如下:發送多個郵件通過發送()recv(),套接字編程,C
客戶:
int main(int argc, char **argv) {
struct sockaddr_in servaddr;
int sock = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6789);
servaddr.sin_addr.s_addr = inet_addr(<ip_address_of_server>);
while(1) {
char message[161];
fgets(message, 161, stdin);
/* Replacing '\n' with '\0' */
char *tmp = strchr(message, '\n');
if (tmp) *tmp = '\0';
connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr));
send(sock, message, strlen(message), 0);
close(sock);
}
}
服務器:
int main(int argc, char **argv) {
struct sockaddr_in servaddr;
int sock = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6789);
bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr));
listen(sock, 5);
while(1) {
int clisock = accept(sock, (struct sockaddr *) NULL, NULL);
if (clisock >= 0) {
int messageLength = 160;
char message[messageLength+1];
int in, index = 0, limit = messageLength;
while ((in = recv(clisock, &message[index], messageLength, 0)) > 0) {
index += in;
limit -= in;
}
printf("%s\n", message);
}
close(clisock);
}
}
現在,這個工程的第一條消息我送。但是,它不能夠建立另一個連接(當我嘗試在客戶端程序中連接時,我得到了錯誤信息「Bad file descriptor」。)任何人都可以看到我誤解了什麼嗎?謝謝:)
accept調用或recv調用都會返回錯誤。檢查它,原因將變得更清晰。 perror()對此非常方便。 (注意:如果接受返回一個錯誤,close也可能返回一個錯誤,並且最好檢查bind和listen返回值。) – Flexo 2010-11-13 12:51:22
當我調用Client中的connect()時出現錯誤,並且出現錯誤消息「錯誤的文件描述符」 – ragnaroh 2010-11-13 13:42:50
請記住,TCP是一個流。它沒有消息。您收到160個字節,可能是客戶端發送的幾條應用程序消息。 – nos 2010-11-13 13:57:45