- 论坛徽章:
- 0
|
我的电脑装的vista的操作系统,为了学习unix网络编程,我在机器里面用vmware装了两个fedora9,并且都是选择的网络桥接选项。它们各自有各自的ip地址,互相也可以ping通。
现在出现这么一个问题: 我编写了一个简单的回射程序,分别有客户端和服务器端。我将它们放在同一个linux下,分别运行,结果很正常。但分别在两个fedora9下编译运行后,客户端总是得不到预期的结果,输入后,程序直接退出。
请问哪位大虾遇见过这样的问题啊?麻烦解答。很急啊,看了一段时间书,结果运行不了,心里那个苦啊。麻烦哪位大虾伸手拉拉兄弟啊。
我把源代码贴出来,望各位大虾指点:
服务器端:
#include<stdio.h>
#include<errno.h>
#include<strings.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define SA struct sockaddr
void str_echo(int);
int main(int argc,char **argv)
{
int listenfd,connfd;
pid_t childpid;
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;
listenfd = socket(AF_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(9877);
bind(listenfd,(SA *)&servaddr,sizeof(servaddr));
listen(listenfd,5);
for(;
{
clilen = sizeof(cliaddr);
connfd = accept(listenfd,(SA *)&cliaddr,&clilen);
if((childpid = fork()) ==0)
{
close(listenfd);
str_echo(connfd);
exit(0);
}
close(connfd);
}
}
void str_echo(int sockfd)
{
ssize_t n;
char buf[4096];
again:
while((n = read(sockfd,buf,4096))>0)
write(sockfd,buf,n);
if(n < 0 && errno ==EINTR)
goto again;
else if(n<0)
printf("str_echo:read error";
}
客户端:
#include<stdio.h>
#include<unistd.h>
#include<netinet/in.h>
#include<strings.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define SA struct sockaddr
void str_cli(FILE *,int);
int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
if(argc != 2)
{
printf("usage: tcpcli<IPaddress>";
return -1;
}
sockfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(9877);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
connect(sockfd,(SA *)&servaddr,sizeof(servaddr));
str_cli(stdin,sockfd);
}
void str_cli(FILE *fp,int sockfd)
{
char sendline[4096],recvline[4096];
while(fgets(sendline,4096,fp) != NULL)
{
write(sockfd,sendline,strlen(sendline));
if(read(sockfd,recvline,4096) ==0)
printf("str_cli: server terminated permaturely";
fputs(recvline,stdout);
}
} |
|