免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1539 | 回复: 1
打印 上一主题 下一主题

unix网络编程求救 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-13 00:31 |只看该作者 |倒序浏览
我的电脑装的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);
        }
}

论坛徽章:
0
2 [报告]
发表于 2009-04-13 08:15 |只看该作者
你连最基本的判断错误函数都没有?
有很多地方可能退出的~
比如绑定不成功 端口被占用
服务器端口未打开,
多用用perror~和printf 这样自己也容易找到在哪里退出了
最基本的debug还是要会的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP