免费注册 查看新帖 |

Chinaunix

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

简单的30行的socket编程,我就是看不出问题来。(典型括号错误,已解决) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-28 16:56 |只看该作者 |倒序浏览
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include "error.h"

extern int errno;
#define BUF_SIZE 1000
int main()
{
      int sd,sd2,alen,n;
      struct  sockaddr_in my_addr;
      struct  sockaddr_in client_addr;
      int myport=10001;
      char buf[BUF_SIZE];
      
      sd=socket(PF_INET, SOCK_STREAM, 0);
      printf("create a socket,socket = %d\n",sd);

      memset((char *)&my_addr,0,sizeof(my_addr)); /* clear sockaddr structure */
      my_addr.sin_family = AF_INET;         /*set family to Internet*/
      my_addr.sin_addr.s_addr = INADDR_ANY; /* set the local IP address   */
      my_addr.sin_port = htons((u_short)myport);

      /* Bind a local address to the socket */
      if (bind(sd, (struct sockaddr *)&my_addr, sizeof(struct  sockaddr_in)) < 0) {
              printf("bind failed\n");
              return -1;
      }
      /* Specify size of request queue */
      if (listen(sd, 1000) < 0) {
              printf("listen failed\n");
              return -1;
      }
      alen=sizeof(struct  sockaddr_in);
      if ( sd2=accept(sd, (struct sockaddr *)&client_addr,&alen ) < 0) {
             printf("accept_client(): accept failed. %s .\n",strerror(errno));
            return -1;
      }/*warning, sd2 can eq 0 */
      printf("accept a sd2 =%d from sd= %d.\n",sd2, sd);
      n=recv(sd2, buf, BUF_SIZE, 0);
      if (n<0)
            printf("recv failed, %s",strerror(errno));
      else if (n==0)
            printf("recv failed2, %s",strerror(errno));
      else
            printf("recv ok.");
      close(sd2);
      close(sd);
}
       
accept死活返回0,接下去recv就出错,据说accept返回0是把stdin关闭了,我这里似乎没有。
情帮我看看,
谢谢!

[ 本帖最后由 archphoenix 于 2006-9-28 19:59 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-09-28 17:00 |只看该作者
>> if ( sd2=accept(sd, (struct sockaddr *)&client_addr,&alen ) < 0)
if ( (sd2=accept(sd, (struct sockaddr *)&client_addr,&alen ) )< 0)

少个括号.

论坛徽章:
0
3 [报告]
发表于 2006-09-28 17:15 |只看该作者
if ( sd2=accept(sd, (struct sockaddr *)&client_addr,&alen ) < 0)
改成
if ( (sd2 = accept(sd, (struct sockaddr *)(&client_addr) , &alen)) < 0)
你少加一对括号
哎呀,这错误可要牢记啊

论坛徽章:
0
4 [报告]
发表于 2006-09-28 17:28 |只看该作者
改掉那行,变为

  1.                 sd2 = accept(sd, (struct sockaddr *) & client_addr, &alen);
  2.                 if (sd2<0) {
复制代码

即可

不过楼上几位给出的是根本的解决方法

论坛徽章:
0
5 [报告]
发表于 2006-09-28 19:58 |只看该作者
谢谢,非常典型的错误!

论坛徽章:
0
6 [报告]
发表于 2006-09-29 08:02 |只看该作者
哈哈  确实很常见的问题

所以有人说“我从来不记忆什么优先级   全部加括号   绝对保证自己的一套优先级”
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP