Chinaunix

标题: 简单的30行的socket编程,我就是看不出问题来。(典型括号错误,已解决) [打印本页]

作者: archphoenix    时间: 2006-09-28 16:56
标题: 简单的30行的socket编程,我就是看不出问题来。(典型括号错误,已解决)
#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 编辑 ]
作者: mq110    时间: 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)

少个括号.
作者: lishengxu    时间: 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)
你少加一对括号
哎呀,这错误可要牢记啊
作者: langue    时间: 2006-09-28 17:28
改掉那行,变为

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

即可

不过楼上几位给出的是根本的解决方法
作者: archphoenix    时间: 2006-09-28 19:58
谢谢,非常典型的错误!
作者: geba168    时间: 2006-09-29 08:02
哈哈  确实很常见的问题

所以有人说“我从来不记忆什么优先级   全部加括号   绝对保证自己的一套优先级”




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2