arpa/inet.h所引起的Segmentation fault及网络编程常见的头文件

  最近在学习Linux网络编程方面的知识,感觉还是有些困难。主要是对协议过程的理解,还有socket的API的理解不够深刻。今天复习编写了一个TCP的服务端和客户端的程序实现client.c从命令行参数中获得一个字符串发给服务器,然后接收服务器返回的已处理的字符串并打印。

  

  server.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <sys/socket.h>
 6 #include <netinet/in.h>
 7 //#include <arpa/inet.h>
 8
 9 #define MAXLINE 80
10 #define SERV_PORT 8000
11
12 int main(void)
13 {
14     struct sockaddr_in servaddr,cliaddr;   //IPV4的地址结构
15     socklen_t cliaddr_len;
16     int listenfd,connfd;
17     char buf[MAXLINE];
18     char str[INET_ADDRSTRLEN];
19     int i,n;
20
21     if(-1 == (listenfd =  socket(AF_INET,SOCK_STREAM,0)))   //对于IPV4的family的参数为AF_INET for TCP SOCK_STREAM 表示面向流的传输协议
22     {
23         perror("socket Error");
24         exit(1);
25     }
26     bzero(&servaddr,sizeof(servaddr));                     //对于UDP协议 type is SOCK_DGRAM  表示面向数据报的传输协议   protocol指定为零
27     servaddr.sin_family = AF_INET;               //设置地址类型
28     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//网络地址为INADDR_ANY
29     servaddr.sin_port = htons(SERV_PORT);        //端口号为SERV_PORT 定义为8000
30
31     if(-1 == bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)))
32     {
33         perror("Bind error");
34         exit(1);
35     }
36
37     if( -1 == listen(listenfd,20))
38     {
39         perror("Listen error");
40         exit(1);
41     }
42
43     printf("Accepting connections ..\n");
44
45     while(1){
46         cliaddr_len = sizeof(struct sockaddr_in);
47         if( -1 == (connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&cliaddr_len)))
48         {
49             perror("Accept error");
50             exit(1);
51         }
52
53         if(-1 ==(n = read(connfd,buf,MAXLINE)))
54         {
55             perror("read error");
56             exit(1);
57         }
58         printf("Connect from %s:%u ...!\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
59
60     for (i = 0; i < n; i++)
61         buf[i] = toupper(buf[i]);
62     write(connfd, buf, n);
63
64         close(connfd);
65     }
66     close(listenfd);
67     exit(0);
68 }                                                                                                                                   

  client.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <unistd.h>
 5 #include <sys/socket.h>
 6 #include <netinet/in.h>
 7
 8 #define MAXLINE 80
 9 #define SERV_PORT 8000
10
11 int main(int argc,char **argv)
12 {
13     struct sockaddr_in servaddr;
14     char buf[MAXLINE];
15     int sockfd,n;
16     char *str;
17
18     if(argc != 2)
19     {
20         fputs("Usage: ./client message\n",stderr);
21         exit(1);
22     }
23     str = argv[1];
24     sockfd = socket(AF_INET,SOCK_STREAM,0);
25     bzero(&servaddr,sizeof(servaddr));
26     servaddr.sin_family = AF_INET;
27     inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);
28     servaddr.sin_port = htons(SERV_PORT);
29
30     connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
31     write(sockfd,str,strlen(str));
32     n = read(sockfd,buf,MAXLINE);
33     printf("Response from server:\n");
34
35     //if(-1 == read(sockfd,buf,1024)){
36     //     perror("Recv Error:");
37     //}
38     write(STDOUT_FILENO, buf, n);
39
40   close(sockfd);
41     return 0;
42 }                                                               

  但是发现一直有个Segmentation fault显示没有返回正确的结果,一开始还以为是数组buf越界了,但检查总是没有什么问题。

[[email protected]_62_27_centos changeBigSmall]# ./server
Accepting connections ..
Segmentation fault

[[email protected]_62_27_centos changeBigSmall]# ./client abcdef
Response from server:
[[email protected]_62_27_centos changeBigSmall]#

  发现也没有出现perror()的错误还有printf一直没有打印连接的端口号,连接成功理应由成功连接的地址端口显示出来。最后对函数inet_ntoa()查询是发现要加入#include <arpa/inet.h> 的头文件。哦NO,原来没有加入相应的头文件也会引起段错误。

  加上就好了。

  

  

时间: 2024-10-20 03:30:29

arpa/inet.h所引起的Segmentation fault及网络编程常见的头文件的相关文章

Linux程序Segmentation fault (core dumped)

1 问题原因 Segmentation fault (core dumped)多为内存不当操作造成.空指针.野指针的读写操作,数组越界访问,破坏常量等.对每个指针声明后进行初始化为NULL是避免这个问题的好办法.排除此问题的最好办法则是调试. 更为详细的原因: (1)内存访问越界 a) 由于使用错误的下标,导致数组访问越界b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符c) 使用strcpy, strcat, sprintf, strcmp, strcas

C++预编译头文件(#include &quot;stdafx.h&quot;)

来源:http://blog.sina.com.cn/s/blog_4ac766c00100qsbd.html http://blog.csdn.net/txh0001/article/details/7031058 作为一个C++菜鸟,在预编译头文件(#include "stdafx.h")上纠结了很久,今天打算彻底弄明白它. 1.预编译头文件的概念 所谓的预编译头文件,其实我们很熟悉的,这里的头文件(Microsoft Visual C++中)一般的说就是我们常见的stdafx.h

头文件 INTRINS.H 的用法

KEIL中头文件INTRINS.H的作用 在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便. 内部函数 描述 crol_ 字符循环左移_cror_ 字符循环右移_irol_ 整数循环左移_iror_ 整数循环右移_lrol_ 长整数循环左移_lror_ 长整数循环右移_nop_ 空操作8051 NOP 指令_testbit_ 测试并清零位8051 JBC 指令 函数名: _crol_,_irol_,_lrol_原 型: unsigned char _cr

函数栈溢出引起的段错误segmentation fault

遇到了一个奇怪的问题: 有一个回调函数中发生了段错误,但经检查也没有什么明显的错误,然后用排除法一点一点屏蔽,最后定位在一个函数里出错,但这个函数没什么明显错误.最后把入口参数改为引用传递就不报错误. 但隔了一段时间这个函数又报错了,原因是我加一行代码,但这行代码就是一个赋值语句:于是我不甘心,又开始排除法,最后定位到一个变量,加上它报错,不加就不报错:我一直怀疑是不是linux对一个函数的大小有限制:于是将这个函数换成全局变量,而在此函数中用的此变量时候采用指针,诶,不再报段错误了,世界终于安

Segmentation Fault的一种定位方法

1. 介绍 网上有很多Segmentation Fault的调试方法,下面这篇文件就很好 <Linux环境下段错误的产生原因及调试方法小结> 然而笔者在实际的使用中由于各种原因总觉得不够用 于是在网上找到了一种个人觉得更直接的方法 2. 原理 Segmentation Fault发生的时候,程序收到了信号11(SIGSEGV) 我们捕获该信号,然后利用事故发生时保存的寄存器现场加上栈信息定位到具体行 这里参考了< C/C++捕获段错误,打印出错的具体位置(精确到哪一行) > 使用其

times(NULL) Segmentation fault

/****************************************************************************** * times(NULL) Segmentation fault * 说明: * 在PC机上times(NULL)是没问题的,但在嵌入式Linux上,貌似不传递参数是有可能 * 会出问题的. * * 2017-7-6 深圳 龙华樟坑村 曾剑锋 ************************************************

Linux 下的段错误(Segmentation fault)调试方法

我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的.实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除.但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句. 下面将就以下的一个存在段错误的程序介绍几种调试方法: 1 dummy_function (void) 2 { 3 unsig

你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)

什么让你对C/C++如此恐惧? 晦涩的语法?还是优秀IDE的欠缺? 我想那都不是问题,最多的可能是一个类似这样的错误: 段错误(Segmentation fault) 这是新手无法避免的错误,也是老手极力回避也经常遇到的错误. 本篇,试图简略地剖析一段会引发这个错误的程序,带来一些启发. 先看两份代码,一份是错误的. 错误代码 #include "string.h" #include <stdlib.h> #include <stdio.h> void func

eclipse+CDT调试segmentation fault错误

先来看两段代码-- 错误代码: #include "string.h" #include <stdlib.h> #include <stdio.h> void test(char ** dest, char * src, int n) { (*dest) = (char*) malloc(sizeof(char) * n); strcpy(*dest, src); } int main(int argc, char** args) { char ** p = N