這只是一個簡單的聊天程序,其中echoclient發送數據到echoserver。在給我們的例子代碼中,爲什麼當我使用IP地址xxx.xxx.xxx.xxx(其中xxx的範圍是0-255,例如123.124.12.1)時,客戶端不會連接,但它會如果我輸入隨機數字,如12312或23423?在這種情況下,當我打印網絡訂購的IP,它給TCP C:客戶端未使用您輸入的IP地址進行連接?
Network ordered ip(client side): 00000000 Network ordered ip(server side): 127.0.0.1.
我讀到127.0.0.1是環回IP地址爲本地主機。但我的問題是,爲什麼客戶端只與該地址連接?
當我運行./echoclient 12312
, 客戶端連接和程序功能,因爲它應該。但是,如果我運行./echoclient 123.123.12.1
,客戶端不會連接。
..或我連接錯誤的方式?
下面的代碼:
echoserver.c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char **argv)
{
int listenfd,connfd;
struct sockaddr_in servaddr,cliaddr;
socklen_t len = sizeof(cliaddr);
char cli_ip[32];
char mesg[1024];
listenfd = socket(PF_INET,SOCK_STREAM,0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(54322);
if (bind(listenfd, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0){
perror(NULL);
exit(-1);
}
//not present in udp server
listen(listenfd,2);
while(1){
//not present in udp server
connfd = accept(listenfd,(struct sockaddr *)&cliaddr,&len);
inet_ntop(AF_INET,(struct in_addr *) &cliaddr.sin_addr, cli_ip, sizeof(cli_ip));
printf("Client %s connected. \n",cli_ip);
while(1){
memset(mesg,0,sizeof(mesg));
if(recvfrom(connfd,mesg,sizeof(mesg),0,(const struct sockaddr *)&cliaddr,&len) > 0){
printf("From %s port %d: %s",cli_ip,ntohs(cliaddr.sin_port),mesg);
}
else {
printf("Client %s disconnected. \n",cli_ip);
break;
}
}
close(connfd);
}
close(listenfd);
return 0;
}
echoclient.c
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
socklen_t len = sizeof(servaddr);
char mesg[1024];
if(argc!=2){
printf("Usage: %s <ip_addr>\n",argv[0]);
exit(1);
}
sockfd = socket(PF_INET,SOCK_STREAM,0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(54322);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
//printf("Network ordered ip: %08x\n",servaddr.sin_addr.s_addr);
//not present in udp clients
connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
while(1){
fgets(mesg,sizeof(mesg),stdin);
sendto(sockfd,mesg,strlen(mesg),0,(const struct sockaddr *)&servaddr,len);
}
close(sockfd);
return 0;
}
預先感謝您!
多個問題屬於中,那麼,多個問題,每個都有自己的相關示例代碼等。通常,您的任何問題越容易閱讀和回答,您就越有可能得到答案。 (另外,我真的不知道你最後一段的剩餘部分是什麼意思。) – millimoose
然後編輯我的問題。 =)對不起,如果最後一段帶來混亂。那麼我只需要回答我的第一個問題。我真的不知道我是否對TCP客戶端正確地做了正確的事情。我真的需要一些啓發。 – ingenieria