免费注册 查看新帖 |

Chinaunix

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

socket 通信 client/server端启动顺序问题!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-30 09:39 |只看该作者 |倒序浏览
如果我先启动client端, 每秒循环尝试连接一次server,
然后启动server端, 可是client总也无法连上server.
按照程序逻辑,不应该连接不上啊!
为什么呢,请请大虾支教!!!!

源代码如下:
server:
#include<stdio.h>;
#include<string.h>;
#include<stdlib.h>;
#include<sys/types.h>;
#include<sys/socket.h>;
#include<sys/wait.h>;
#include<netinet/in.h>;
#define myport  8899

void main()
{
        char  workbuffer[64];

        unsigned int opt=1;

        int sockfd, newsockfd, ret;
        unsigned long size;
        struct sockaddr_in sin, theirsin;
        sin.sin_family=AF_INET;
        sin.sin_port=htons(myport);
        sin.sin_addr.s_addr=inet_addr("127.0.0.1";
        bzero(&(sin.sin_zero), ;
        strcpy(workbuffer, "123456789";

        sockfd=socket(AF_INET, SOCK_STREAM, 0);
        setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR,(char *)&opt, sizeof(int));
        while(bind(sockfd,(struct sockaddr *)&sin,sizeof(struct sockaddr))==-1);
        printf("binded\n";
        while(listen(sockfd, 5)==-1);
        printf("listened\n";
        while(1)
        {
                size=sizeof(struct sockaddr_in);
                newsockfd=accept(sockfd, (struct sockaddr *)&theirsin,&size);
                if(newsockfd==-1) continue;
                printf("accepted\n";
                if(!fork())
                {
                        send(newsockfd, workbuffer, sizeof(workbuffer), 0);
                        close(newsockfd);
                        exit(0);
                }
                close(newsockfd);
                while(waitpid(-1, NULL, WNOHANG)>;0);
        }
}

client:
#include<stdio.h>;
#include<string.h>;
#include<stdlib.h>;
#include<sys/types.h>;
#include<sys/socket.h>;
#include<sys/wait.h>;
#include<netinet/in.h>;
#define myport 8899
void main()
{
        int sockfd, size;
        char workbuffer[64];
        struct sockaddr_in theirsin;
        unsigned int opt;

        memset(workbuffer, 0x00, sizeof(workbuffer));
       
        sockfd=socket(AF_INET, SOCK_STREAM, 0);
        opt = 1;
        setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(int));

        theirsin.sin_family=AF_INET;
        theirsin.sin_port=htons(myport);
        theirsin.sin_addr.s_addr=inet_addr("127.0.0.1";
        bzero(&(theirsin.sin_zero), ;

        while(connect(sockfd,(struct sockaddr *)&theirsin,sizeof(struct sockaddr))==-1)
        {
                printf("wait to connect \n";
                sleep(1);
                continue;
        }

        size=recv(sockfd, workbuffer, sizeof(workbuffer), 0);
        workbuffer[size]=0x00;
        close(sockfd);
        printf("%s\n", workbuffer);
}

论坛徽章:
0
2 [报告]
发表于 2004-04-30 10:04 |只看该作者

socket 通信 client/server端启动顺序问题!!!

if(!fork())
{
send(newsockfd, workbuffer, sizeof(workbuffer), 0);
close(newsockfd);
exit(0);
}
//close(newsockfd); 试试把这行代码注释掉

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-04-30 10:06 |只看该作者

socket 通信 client/server端启动顺序问题!!!

while(bind(sockfd,(struct sockaddr *)&sin,sizeof(struct sockaddr))==-1);


如果bind成功了,while为假,怎么执行

论坛徽章:
0
4 [报告]
发表于 2004-04-30 11:48 |只看该作者

socket 通信 client/server端启动顺序问题!!!

原帖由 "yyfeng" 发表:
if(!fork())
{
send(newsockfd, workbuffer, sizeof(workbuffer), 0);
close(newsockfd);
exit(0);
}
//close(newsockfd); 试试把这行代码注释掉



注释后也没作用啊!

并且父进程不需要newsockfd啊, 所以才关闭的!

论坛徽章:
0
5 [报告]
发表于 2004-04-30 11:52 |只看该作者

socket 通信 client/server端启动顺序问题!!!

原帖由 "蓝色键盘" 发表:
while(bind(sockfd,(struct sockaddr *)&sin,sizeof(struct sockaddr))==-1);


如果bind成功了,while为假,怎么执行


这一句只是用来给sockfd赋上本地半相关, 如果成功就执行下面的语句。这和问题不矛盾啊!

问题是:
如果先启server,再启client连接可以建立,
但是先启client, 后启server就无法建立连接!

论坛徽章:
0
6 [报告]
发表于 2004-04-30 16:19 |只看该作者

socket 通信 client/server端启动顺序问题!!!

  1. while(connect(sockfd,(struct sockaddr *)&theirsin,sizeof(struct sockaddr))==-1)
  2. {
  3. printf("wait to connect \n");
  4. sleep(1);
  5.                  <-- close(sockfd);
  6.                  <-- sockfd = socket(....);
  7.                  <-- ......
  8. continue;
  9. }
复制代码



connect 失败后要先 close() 然后 重新 socket() 再 connect()
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP