免费注册 查看新帖 |

Chinaunix

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

linux下socket再次bind的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-22 15:52 |只看该作者 |倒序浏览
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#include <signal.h>

#define CLIENT_PORT 2004
#define SERVER_PORT 20001
#define LENGTH_OF_LISTEN_QUEUE 10
#define BUFFER_SIZE 255

int main(int argc, char **argv)
{
        int servfd,clifd,length=0;
        struct sockaddr_in servaddr,cliaddr;
        char cc[100];
        int port;
        pid_t pid;
        srand(time(NULL));
        if ((servfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
        {
                printf("create socket error!\n");
                exit(1);
        }
        switch (argv[1][0]){
        case '0':
                port=2001;break;
        case '1':
                port=2002;break;
        }
        bzero(&servaddr,sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(port);

        if(bind(servfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
        {
                printf("bind to port %d failure!\n",port);
                exit(1);
        }

        if(listen(servfd,LENGTH_OF_LISTEN_QUEUE)<0)
        {
                printf("call listen failure!\n");
                exit(1);
        }
        char c;int i;
        do
        {
                char buf[BUFFER_SIZE];
                long timestamp;
                socklen_t length = sizeof(cliaddr);
                clifd = accept(servfd,(struct sockaddr *)&cliaddr,&length);
                if(clifd < 0)
                {
                        printf("error comes when call accept!\n");
                        break;
                }
                pid = fork();
                switch(pid)
                {
                default:
                        while(length = read(clifd,buf,BUFFER_SIZE))
                        {
                                sprintf(cc,"\n-------recv message start-------\n");
                                write(STDOUT_FILENO, cc,strlen(cc));
                                write(STDOUT_FILENO, buf, length);
                                //sprintf(cc,"\n%d\n",length);
                                //write(STDOUT_FILENO, cc, 100);
                                sprintf(cc,"\n-------recv message end-------\n");
                                write(STDOUT_FILENO, cc,strlen(cc));
                        }
                        kill(pid,SIGKILL);
                        break;
                case 0:
                        {}
                        int sockfd;
                        struct sockaddr_in servaddr2,cliaddr2;
                        socklen_t socklen2 = sizeof(servaddr);
                        char buf2[BUFFER_SIZE];
                        int cp;
                        cp = CLIENT_PORT+( rand() % 65535 );
                        if((clifd = socket(AF_INET,SOCK_STREAM,0)) < 0)
                        {
                                printf("create socket error!\n");
                                exit(1);
                        }
                        bzero(&cliaddr2,sizeof(cliaddr2));
                        cliaddr2.sin_family = AF_INET;
                        cliaddr2.sin_port = htons(cp);
                        cliaddr2.sin_addr.s_addr =htons(INADDR_ANY);
                       
                        bzero(&servaddr2,sizeof(servaddr));
                        servaddr2.sin_family = AF_INET;
                        inet_aton("127.0.0.1",&servaddr.sin_addr);
                        servaddr2.sin_port = htons(SERVER_PORT);
                        int aaa;
                        if((aaa=bind(sockfd,(struct sockaddr *)&cliaddr2,sizeof(cliaddr2))) < 0)
                        {
                                printf("bind to port %d failure!\n",cp);
                                exit(1);
                        }


                        if(connect(sockfd,(struct sockaddr*)&servaddr2,socklen2) < 0)
                        {
                                printf("can`t connect to ");
                                exit(1);
                        }
                       
                        while(1){
                               
                                i = 0;
                                while( (c = getchar())!='\n'){
                                        buf2=c;
                                        i++;
                                }
                               
                                buf2=0;
                                write(sockfd,buf2,strlen(buf2));
                               
                        }
                        break;
                }
        }while(1);
        close(servfd);
        return 0;
}


程序在红色部分bind的时候出错了。。。可能是什么原因?不解。。。

[ 本帖最后由 leeews 于 2008-5-22 16:38 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-05-22 16:42 |只看该作者
刚才调试发现,程序运行开始后,cp的值就不变了。
即使客户端重新连接以使得cp = CLIENT_PORT+( rand() % 65535 );再次执行,cp的值仍然没有变化,相当诡异

[ 本帖最后由 leeews 于 2008-5-22 16:54 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-05-22 17:22 |只看该作者
很不解!
看lz的代码愿意应该是:父进程做s,子进程做c。
但是为什么c还要bind呢?

另外使用地址重用,bind就不会出错了

论坛徽章:
0
4 [报告]
发表于 2008-05-22 19:40 |只看该作者
那个sockfd你没有初始化! 而且, 你的程序的逻辑根本就不通. 你这段代码怎么得到的?

论坛徽章:
0
5 [报告]
发表于 2008-05-22 21:11 |只看该作者
原帖由 soul_of_moon 于 2008-5-22 17:22 发表
很不解!
看lz的代码愿意应该是:父进程做s,子进程做c。
但是为什么c还要bind呢?

另外使用地址重用,bind就不会出错了

子进程连接的不是父进程的server。
另有一个东西的client连过来,然后,创建子进程,然后,这个子进程再去连接那个东西的server。

论坛徽章:
0
6 [报告]
发表于 2008-05-22 21:12 |只看该作者
原帖由 ideawu 于 2008-5-22 19:40 发表
那个sockfd你没有初始化! 而且, 你的程序的逻辑根本就不通. 你这段代码怎么得到的?

很惭愧,是我自己写的。。。。。
接触socket编程只有2天,丢人了。。

论坛徽章:
0
7 [报告]
发表于 2008-05-23 09:37 |只看该作者
原帖由 leeews 于 2008-5-22 21:11 发表

子进程连接的不是父进程的server。
另有一个东西的client连过来,然后,创建子进程,然后,这个子进程再去连接那个东西的server。

我的意思是:
tcp流程:
server                                  client

socket                                  socket

bind               

listen                                    connect

accept

read/write                           read/write

即client是没有bind的

论坛徽章:
0
8 [报告]
发表于 2008-05-23 09:57 |只看该作者
kill(pid,SIGKILL) 这个有点狠啊。。。
建议lz先看看socket流程,然后看看fork和close函数的定义。

论坛徽章:
0
9 [报告]
发表于 2008-05-23 11:31 |只看该作者
原帖由 soul_of_moon 于 2008-5-23 09:37 发表

我的意思是:
tcp流程:
server                                  client

socket                                  socket

bind               

listen                                    conn ...

这样阿,多谢赐教。

论坛徽章:
0
10 [报告]
发表于 2008-05-23 11:36 |只看该作者
原帖由 ghosthjf 于 2008-5-23 09:57 发表
kill(pid,SIGKILL) 这个有点狠啊。。。
建议lz先看看socket流程,然后看看fork和close函数的定义。

。。。。。那不用kill(pid,SIGKILL)的话怎么做比较好?
上司2天前让写一个linux下的网络测试程序,急着要,之前完全没接触过,打算等搞完了好好从APUE和UNP看起。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP