bbs.ChinaUnix.net
首页 | 新闻 | Linux | FreeBSD | AIX | Windows | 博客 | 论坛 | 存储 | 网络 | 人才 | Wiki | 资料 | 读书 | 手册 | 下载 | 空间 | 搜索
  免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


socket write()段错误


  首页 » 论坛 » C/C++ »
[打印] [收藏] [本帖文本页] [推荐此主题给朋友]

在运行<<高级Unix编程>>中的一个socket例子的时候,发现:
客户端写,服务器读一切正常,
而当服务器在write()的时候段错误了。最奇怪的是,在这种情况下,客户端还能读到服务器所写的。
这是咋回事呢??

说明,所谓的客户端与服务器都只是进程。

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <sys/types.h>
  4. #include <sys/un.h>
  5. #include <sys/socket.h>
  6. #include <netinet/in.h>
  7. #include <arpa/inet.h>

  8. #define SOCKETNAME        "Socket"

  9. #define        PRINT(fmt...) \
  10. do {\
  11.         printf("%s[%d]:", __FILE__, __LINE__);\
  12.         printf(fmt);\
  13. }while(0)

  14. int main(void)
  15. {
  16.         struct sockaddr_un sa;
  17.         int forkpid = 0;
  18.         (void)unlink(SOCKETNAME);
  19.         strcpy(sa.sun_path, SOCKETNAME);
  20.         sa.sun_family = AF_UNIX;

  21.         forkpid = fork();
  22.         if(forkpid == 0){/* child---client */
  23.                 int fd_skt;
  24.                 char buf[100];
  25.                 int rlen = 0;
  26.                 int wlen = 0;
  27.                 int connect_ret = 0;
  28.                
  29.                 PRINT("client=>pid: %d\n", getpid());

  30.                 fd_skt = socket(AF_UNIX, SOCK_STREAM, 0);
  31.                 PRINT("client=>fd_skt: %d\n", fd_skt);
  32.                 if(fd_skt < 0){
  33.                         exit(-1);
  34.                 }

  35.                 while((connect_ret = connect(fd_skt, (struct sockaddr *)&sa, sizeof(sa))) == -1){
  36.                         PRINT("client=>connect_ret: %d\n", connect_ret);
  37.                         if(errno == ENOENT){
  38.                                 PRINT("client=>\n");
  39.                                 sleep(1);
  40.                                 continue;
  41.                         }
  42.                         else{
  43.                                 exit(-1);
  44.                         }
  45.                 }
  46.                 PRINT("client=>write\n");
  47.                 wlen = write(fd_skt, "Hello!", 7);
  48.                 PRINT("client=>wlen = %d\n", wlen);
  49.                 if(wlen < 0){
  50.                         exit(-1);
  51.                 }

  52.                 sleep(1);

  53.                 rlen = read(fd_skt, buf, sizeof(buf));
  54.                 PRINT("client=>rlen = %d\n", rlen);
  55.                 if(rlen < 0){
  56.                         exit(-1);
  57.                 }
  58.                 PRINT("client=>client read: %s\n", buf);
  59.                 rlen = close(fd_skt);
  60.                 PRINT("client=>close() = %d\n", rlen);
  61.                 if(rlen < 0){
  62.                         perror("close()");
  63.                         //exit(-1);
  64.                 }
  65.                 PRINT("client=>exit\n");
  66.         }
  67.         else{/* parent---server */
  68.                 int fd_skt, fd_client;
  69.                 char buf[100];
  70.                 struct sockaddr_un dst;
  71.                 int rlen = 0;
  72.                 int wlen = 0;

  73.                 PRINT("server=>child pid: %d\n", forkpid);
  74.                 //socket
  75.                 fd_skt = socket(AF_UNIX, SOCK_STREAM, 0);
  76.                 PRINT("server=>fd_skt: %d\n", fd_skt);
  77.                 if(fd_skt < 0){
  78.                         exit(-1);
  79.                 }

  80.                 //bind
  81.                 if(bind(fd_skt, (struct socketaddr *)&sa, sizeof(sa)) < 0){
  82.                         PRINT("server=>listen error!\n");
  83.                         exit(-1);
  84.                 }

  85.                 //listen
  86.                 if(listen(fd_skt, SOMAXCONN) < 0){
  87.                         perror("server=>listen");
  88.                         exit(-1);
  89.                 }

  90.                 //accept
  91.                 fd_client = accept(fd_skt, NULL, 0);
  92.                 PRINT("server=>fd_client: %d\n", fd_client);
  93.                 if(fd_client < 0){
  94.                         perror("accept:");
  95.                         exit(-1);
  96.                 }

  97.                 //read and write
  98.                 while(!rlen){
  99.                         sleep(1);
  100.                         rlen = read(fd_client, buf, sizeof(buf));
  101.                         PRINT("server=>rlen: %d\n", rlen);
  102.                         if(rlen < 0){
  103.                                 PRINT("server=>read error!\n");
  104.                                 exit(-1);
  105.                         }
  106.                 }
  107.                 PRINT("server=>read: %s\n", buf);
  108.                 wlen = write(fd_client, "Goodbye!", 9);
  109.                 PRINT("server=>wlen: %s\n", wlen);
  110.                 if(wlen < 0){
  111.                         exit(-1);
  112.                 }

  113.                 if(close(fd_skt) < 0){
  114.                         PRINT("server=>close fail!\n");
  115.                         exit(-1);
  116.                 }
  117.                 if(close(fd_client) < 0){
  118.                         PRINT("server=>close fail!\n");
  119.                         exit(-1);
  120.                 }
  121.                 exit(0);
  122.         }
  123.        
  124. }
复制代码



咋提交后,变成这得型了。再试一次

#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SOCKETNAME        "Socket"

#define        PRINT(fmt...) \
do {\
        printf("%s[%d]:", __FILE__, __LINE__);\
        printf(fmt);\
}while(0)

int main(void)
{
        struct sockaddr_un sa;
        int forkpid = 0;
        (void)unlink(SOCKETNAME);
        strcpy(sa.sun_path, SOCKETNAME);
        sa.sun_family = AF_UNIX;

        forkpid = fork();
        if(forkpid == 0){/* child---client */
                int fd_skt;
                char buf[100];
                int rlen = 0;
                int wlen = 0;
                int connect_ret = 0;
               
                PRINT("client=>pid: %d\n", getpid());

                fd_skt = socket(AF_UNIX, SOCK_STREAM, 0);
                PRINT("client=>fd_skt: %d\n", fd_skt);
                if(fd_skt < 0){
                        exit(-1);
                }

                while((connect_ret = connect(fd_skt, (struct sockaddr *)&sa, sizeof(sa))) == -1){
                        PRINT("client=>connect_ret: %d\n", connect_ret);
                        if(errno == ENOENT){
                                PRINT("client=>\n");
                                sleep(1);
                                continue;
                        }
                        else{
                                exit(-1);
                        }
                }
                PRINT("client=>write\n");
                wlen = write(fd_skt, "Hello!", 7);
                PRINT("client=>wlen = %d\n", wlen);
                if(wlen < 0){
                        exit(-1);
                }

                sleep(1);

                rlen = read(fd_skt, buf, sizeof(buf));
                PRINT("client=>rlen = %d\n", rlen);
                if(rlen < 0){
                        exit(-1);
                }
                PRINT("client=>client read: %s\n", buf);
                rlen = close(fd_skt);
                PRINT("client=>close() = %d\n", rlen);
                if(rlen < 0){
                        perror("close()");
                        //exit(-1);
                }
                PRINT("client=>exit\n");
        }
        else{/* parent---server */
                int fd_skt, fd_client;
                char buf[100];
                struct sockaddr_un dst;
                int rlen = 0;
                int wlen = 0;

                PRINT("server=>child pid: %d\n", forkpid);
                //socket
                fd_skt = socket(AF_UNIX, SOCK_STREAM, 0);
                PRINT("server=>fd_skt: %d\n", fd_skt);
                if(fd_skt < 0){
                        exit(-1);
                }

                //bind
                if(bind(fd_skt, (struct socketaddr *)&sa, sizeof(sa)) < 0){
                        PRINT("server=>listen error!\n");
                        exit(-1);
                }

                //listen
                if(listen(fd_skt, SOMAXCONN) < 0){
                        perror("server=>listen");
                        exit(-1);
                }

                //accept
                fd_client = accept(fd_skt, NULL, 0);
                PRINT("server=>fd_client: %d\n", fd_client);
                if(fd_client < 0){
                        perror("accept:");
                        exit(-1);
                }

                //read and write
                while(!rlen){
                        sleep(1);
                        rlen = read(fd_client, buf, sizeof(buf));
                        PRINT("server=>rlen: %d\n", rlen);
                        if(rlen < 0){
                                PRINT("server=>read error!\n");
                                exit(-1);
                        }
                }
                PRINT("server=>read: %s\n", buf);
                wlen = write(fd_client, "Goodbye!", 9);
                PRINT("server=>wlen: %s\n", wlen);
                if(wlen < 0){
                        exit(-1);
                }

                if(close(fd_skt) < 0){
                        PRINT("server=>close fail!\n");
                        exit(-1);
                }
                if(close(fd_client) < 0){
                        PRINT("server=>close fail!\n");
                        exit(-1);
                }
                exit(0);
        }
       
}



自己调啊,趁此机会学学gdb,实际工作中查问题更凸现技术水平,
__________________________________
C结构体打印



  首页 » 论坛 » C/C++ »
Copyright © 2001-2010 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - ChinaUnix - Archiver - WAP - TOP

GMT+8, 2010-02-09 08:31, Processed in 0.023269 second(s), 7 queries, Gzip enabled.