LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 820|回复: 12

我的这两段socket程序无法连接

[复制链接]
发表于 2004-5-7 22:52:24 | 显示全部楼层 |阅读模式
server.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
  int i,sz,*buf;
  long s,port=123;//,port是端口号
  struct sockaddr_in sa;
  sz=sizeof(sa);//sockaddr_in的长度
  sa.sin_family=AF_INET;
  sa.sin_addr.s_addr=htonl(INADDR_ANY);
  sa.sin_port=htonl(port);

  s=socket(PF_INET,SOCK_STREAM,0);
  bind(s,(struct sockaddr*)&sa,sz);
  listen(s,1);
  printf("%d\n",i);//显示0
  accept(s,(struct sockaddr *)&sa,&sz);
  sz=recv(s,buf,1024,0);
  write(0,buf,sz);
  return 0;
}





client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
  int s,i;
  long port=123;//端口
  s=socket(PF_INET,SOCK_STREAM,0);

  struct sockaddr_in sa;
  sa.sin_family=AF_INET;
  sa.sin_addr.s_addr=inet_addr("192.168.0.1");
  sa.sin_port=htonl(port);

  i=connect(s,(struct sockaddr *)&sa,sizeof(sa));
  printf("%d\n",i);//在这里总是显示-1
  return 0;
}

我的机器IP就是192.168.0.1
多谢了!!!
发表于 2004-5-7 23:36:24 | 显示全部楼层
server .c
htons(port);
bzero(&sa,sizeof(sa));
write(1,buf,za);

client.c
htons(port);
bzeof(&sa,sizeof(sa));

都没有定义port ??
 楼主| 发表于 2004-5-7 23:42:07 | 显示全部楼层
不好意思,忘记了,现在定义上了,port=123
可是还是不能连接啊
多谢了
发表于 2004-5-7 23:48:43 | 显示全部楼层
我也不太懂用真实的ip
我都是一个终端在后台运行一个服务器,
在另一个终端用客户端。连接上127.0.0.1
port要加大点,上50000
发表于 2004-5-7 23:55:22 | 显示全部楼层
ntp             123/tcp    #Network Time Protocol
ntp             123/udp    #Network Time Protocol

??不知道你写的知不支持这个port,ntp详情见rfc(要根据rfc来写这个程序)
发表于 2004-5-8 09:56:43 | 显示全部楼层
用tcpdump抓包
发表于 2004-5-8 13:23:42 | 显示全部楼层
1024以下的端口需要root权限才能bind成功的。
 楼主| 发表于 2004-5-8 14:20:04 | 显示全部楼层
我就是用的root权限啊,可惜还是不行
发表于 2004-5-8 15:49:26 | 显示全部楼层
123 是 /etc/service 里的 Well Known Ports ,可能这就是不可以的原因,但具体的细节我不了解,可以试试>50000的端口。
 楼主| 发表于 2004-5-8 16:00:19 | 显示全部楼层
完成了
//server.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
        int i,sz,newfd;
        char buf[5];
        long s,port=80;
        struct sockaddr_in sa;
        sz=sizeof(sa);

        sa.sin_family=AF_INET;
        sa.sin_addr.s_addr=INADDR_ANY;
        sa.sin_port=htons(80);
        buf[0]='h';
        buf[1]='e';
        buf[2]='l';
        buf[3]='l';
        buf[4]='o';
       
        s=socket(AF_INET,SOCK_STREAM,0);
        //printf("%d\n",s);
        i=bind(s,(struct sockaddr*)&sa,sz);
        printf("bind值为:%d\n",i);
        //printf("%d\n",i);
        i=listen(s,1);
        printf("listen值为:%d\n",i);
        newfd=accept(s,(struct sockaddr *)&sa,&sz);//在收到一个连接之前accept不退出
        printf("newfd是%d\n",newfd);
        if(newfd!=-1)
        {
                printf("已经连接!\n\n");
        }
        sz=-1;
        if(sz==-1)
        {
                sz=recv(newfd,buf,5,0);
        }
        printf("收到的数据包大小sz:%d",sz);
        write(1,buf,5);
        return 0;
}


//client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
        int s,i;
        char buf[5];
        //long port=80 7797
        s=socket(AF_INET,SOCK_STREAM,0);
        printf("socket序号为:%d\n",s);
        struct sockaddr_in sa;
        sa.sin_family=AF_INET;
        sa.sin_addr.s_addr=inet_addr("127.0.0.1");
        sa.sin_port=htons(80);
        i=connect(s,(struct sockaddr *)&sa,sizeof(struct sockaddr));
        printf("connet值为%d\n",i);
        i=send(s,"hello",5,0);
        printf("send值为%d\n",i);
        return 0;
}

错误原因:
1.端口号转换成网络格式是16位应该用htons,而htonl转换成了32位
2.在发送和接收阶段都会有一段时间的延时,需要等待
比如用
int sz=-1;//受到的数据大小
while(sz=-1)
{
sz=recv(s,buf,5,0);//recv在接收失败的情况下返回-1
}
:thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表