我寫了一些代碼在C中的TCP服務器,回聲無論它得到。問題在於,當我第一次發送數據時會迴應它,並在下次服務器發回我發送的第一個數據包。日誌是這樣的:TCP回聲服務器,只回聲的第一個數據包(C語言)
Client Send : Packet1
Server reply : Packet1
Client Send : Packet2
server reply : Packet1
服務器代碼如下:
int main(int argc, char** argv) {
int listenfd,connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in servaddr,cliaddr;
listenfd = socket(AF_INET,SOCK_STREAM,0);
printf("Socket listenfd : %d with %d And %d\n",listenfd,AF_INET,SOCK_STREAM);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);
printf("Server address: %d\n",servaddr.sin_addr.s_addr);
bind(listenfd, (SA*) &servaddr, sizeof(servaddr));
printf("Listened: %d\n",listenfd);
listen(listenfd,LISTENQ);
printf("After Listening: %d\n",listenfd);
int num=0;
for(; ;){
clilen=sizeof(cliaddr);
connfd = accept(listenfd, (SA*) &cliaddr,&clilen);
printf("Client no. %d connected\n",++num);
if((childpid=fork())==0){
close(listenfd);
echo(connfd);
exit(0);
printf("Client no. %d Terminated\n",++num);
}
close(connfd);
}
return (EXIT_SUCCESS);
}
我的回聲功能:
void echo(int sockfd) {
ssize_t n;
char buf[MAXLINE];
again:
while ((n = read(sockfd, buf, MAXLINE)) > 0)
writen(sockfd, buf, n);
if (n < 0 && errno == EINTR)
goto again;
else if (n < 0)
printf("read error");
}
客戶端代碼主:
int main(int argc, char** argv) {
int sockfd;
struct sockaddr_in servaddr;
sockfd= socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port= htons(SERV_PORT);
inet_pton(AF_INET,"0.0.0.0",&servaddr.sin_addr);
printf("%d , %d \n",sockfd,servaddr.sin_addr.s_addr);
connect(sockfd, (SA*) &servaddr,sizeof(servaddr));
printf("%d\n",sockfd);
replyBack(stdin,sockfd);
printf("RETURN\n");
return (EXIT_SUCCESS);
}
replyBack功能:
void replyBack(FILE *fp, int sockfd) {
char sendline[MAXLINE], recvline[MAXLINE];
printf("ENTER YOUR ECHOED: \n");
while (fgets(sendline, MAXLINE, stdin) != NULL) {
write(sockfd, sendline, sizeof(sendline));
if (read(sockfd, recvline, MAXLINE) == 0)
{
printf("str_cli: server terminated prematurely");
exit(-1);
}
fputs(recvline, stdout);
}
}
你的客戶端和服務器對我來說工作得很好。檢查以確保您所做的任何系統調用('read','write','connect'等)都返回錯誤或小於預期的值。嘗試使用Wireshark來查看實際上通過網絡發送的內容,這會告訴您問題出在客戶端還是服務器上。嘗試使用'netcat'作爲替代客戶端。 – 2011-03-02 18:43:55
THANKs :)我會嘗試使用它們 – 2011-03-02 19:22:44