套接字读/写错误

时间:2012-07-24 14:33:06

标签: c sockets stream segmentation-fault

会安装valgrind来告诉我这是什么问题,但遗憾的是这个计算机上没有任何新程序......有人能告诉我这个“echo”程序是否存在明显问题?为朋友这样做,所以不知道客户端的布局是在另一边,但我知道读取和写入都是有效的套接字描述符,我已经测试过n = write(写道,“我得到了你的消息\ n“,20);并且n =写(读,“我得到你的消息\ n”,20);两者都有效,所以可以确认这不是无效的fd。谢谢!

int
main( int argc, char** argv ) {


 int reads = atoi(argv[1]) ; 
 int writes = atoi(argv[3]) ; 
 int n ; 


  char buffer[MAX_LINE];
  memset(buffer, 0, sizeof(buffer));



  int i = 0 ; 
  while (1) {
    read(reads, buffer, sizeof(buffer));
    n = write(writes,buffer,sizeof(buffer));
    if (n < 0)  perror("ERROR reading from socket"); 

  } 

4 个答案:

答案 0 :(得分:1)

有一些问题,最紧迫的是你可能在编写时使用sizeof(缓冲区)将垃圾数据推入写套接字。假设您从读取套接字读取数据并且它小于MAX_LINES。当你去写那些数据的时候,你会写任何你读过的东西加上缓冲区末尾的垃圾(即使你在开始时设置memset,连续使用相同的缓冲区而不对不同的读取大小做出反应可能会产生一些垃圾。

尝试从读取中获取返回值并在写入中使用它。如果读取返回指示错误,请清理并退出或重试,具体取决于您希望程序的行为。

int n, size;
while (1) {
   size = read(reads, buffer, sizeof(buffer));

   if (size > 0) {
       n = write(writes, buffer, size);

       if (n != size) {
           // write error, do something
       }  
   } else {
       // Read error, do something
   }
}

当然,这假定您的写入和读取都是有效的文件描述符。

答案 1 :(得分:1)

这两行看起来很可疑:

int reads = atoi(argv[1]) ; 
int writes = atoi(argv[3]) ; 

你真的在命令行上获得文件/套接字描述符号码吗?从哪里来?

检查read(2)write(2)的返回值,然后检查errno(3)的值 - 他们可能会告诉您文件描述符无效(EBADF)。

答案 2 :(得分:1)

目前尚未提出的一点:虽然您知道文件描述符有效,但您应该对命令行进行一些完整性检查。

if (argc < 3) {
       printf("usage: foo: input output\n");
       exit(0);
}

即使使用这种健全性检查,在命令行上传递这样的参数也是危险的。

答案 3 :(得分:0)

  1. 如果您更改以下内容(不过应该这样做),则不需要memset()
  2. read()有一个结果,告诉你它实际读了多少。您应该向write()提供,以便只写出您实际拥有的内容,从而无需归零。
  3. MAX_LINE应至少为512,如果不是更多。
  4. 可能还有一些问题,但我认为我有最重要的问题。