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

  

  server.c

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define MAXLINE 80
#define SERV_PORT 8000 int main(void)
{
struct sockaddr_in servaddr,cliaddr; //IPV4的地址结构
socklen_t cliaddr_len;
int listenfd,connfd;
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
int i,n; if(- == (listenfd = socket(AF_INET,SOCK_STREAM,))) //对于IPV4的family的参数为AF_INET for TCP SOCK_STREAM 表示面向流的传输协议
{
perror("socket Error");
exit();
}
bzero(&servaddr,sizeof(servaddr)); //对于UDP协议 type is SOCK_DGRAM 表示面向数据报的传输协议 protocol指定为零
servaddr.sin_family = AF_INET; //设置地址类型
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//网络地址为INADDR_ANY
servaddr.sin_port = htons(SERV_PORT); //端口号为SERV_PORT 定义为8000 if(- == bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)))
{
perror("Bind error");
exit();
} if( - == listen(listenfd,))
{
perror("Listen error");
exit();
} printf("Accepting connections ..\n"); while(){
cliaddr_len = sizeof(struct sockaddr_in);
if( - == (connfd = accept(listenfd,(struct sockaddr*)&cliaddr,&cliaddr_len)))
{
perror("Accept error");
exit();
} if(- ==(n = read(connfd,buf,MAXLINE)))
{
perror("read error");
exit();
}
printf("Connect from %s:%u ...!\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port)); for (i = ; i < n; i++)
buf[i] = toupper(buf[i]);
write(connfd, buf, n); close(connfd);
}
close(listenfd);
exit();
}

  client.c

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h> #define MAXLINE 80
#define SERV_PORT 8000 int main(int argc,char **argv)
{
struct sockaddr_in servaddr;
char buf[MAXLINE];
int sockfd,n;
char *str; if(argc != )
{
fputs("Usage: ./client message\n",stderr);
exit();
}
str = argv[];
sockfd = socket(AF_INET,SOCK_STREAM,);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr);
servaddr.sin_port = htons(SERV_PORT); connect(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
write(sockfd,str,strlen(str));
n = read(sockfd,buf,MAXLINE);
printf("Response from server:\n"); //if(-1 == read(sockfd,buf,1024)){
// perror("Recv Error:");
//}
write(STDOUT_FILENO, buf, n); close(sockfd);
return ;
}

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

[root@VM_62_27_centos changeBigSmall]# ./server
Accepting connections ..
Segmentation fault

[root@VM_62_27_centos changeBigSmall]# ./client abcdef
Response from server:
[root@VM_62_27_centos changeBigSmall]#

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

  加上就好了<arpa/inet.h>的头文件就好了

[root@VM_62_27_centos changeBigSmall]# ./client abcd
Response from server:
ABCD[root@VM_62_27_centos changeBigSmall]#

  那经过此次教训之后,还是总结一下网络编程中常见的头文件。

 sys/types.h:数据类型定义

 sys/socket.h:提供socket函数及数据结构

 netinet/in.h:定义数据结构sockaddr_in

 arpa/inet.h:提供IP地址转换函数

 netdb.h:提供设置及获取域名的函数

 sys/ioctl.h:提供对I/O控制的函数

 sys/poll.h:提供socket等待测试机制的函数

  其他常见的头文件

unistd.h:提供通用的文件、目录、程序及进程操作的函数

errno.h:提供错误号errno的定义,用于错误处理

fcntl.h:提供对文件控制的函数

time.h:提供有关时间的函数

crypt.h:提供使用DES加密算法的加密函数

pwd.h:提供对/etc/passwd文件访问的函数

shadow.h:提供对/etc/shadow文件访问的函数

pthread.h:提供多线程操作的函数

signal.h:提供对信号操作的函数

sys/wait.h、sys/ipc.h、sys/shm.h:提供进程等待、进程间通讯(IPC)及共享内存的函数

  还有一些常见的结构体

struct sockadd {
unsigned short sa_family;
char sa_data[];
} struct sockaddr_in {
short int sin_family; //AF_INET
unsigned short int sin_port; //网络字节顺序
struct in_addr sin_addr; //struct in_addr { unsigned long s_addr; }
unsigned char sin_zero[];
}

  

  

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

  1. Linux程序Segmentation fault (core dumped)

    1 问题原因 Segmentation fault (core dumped)多为内存不当操作造成.空指针.野指针的读写操作,数组越界访问,破坏常量等.对每个指针声明后进行初始化为NULL是避免这个问 ...

  2. 《UNIX网络编程(第3版)》unp.h等源码文件的编译安装

    操作系统:Mac OS X 10.11.5 1.下载书中的源代码:点击下载 2.切换到解压后的目录 unpv13e,先查看下 README,依次执行: ./configure cd lib make ...

  3. 常用的头文件—— common.h

    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...

  4. 头文件intrins.h

    intrins.h 在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便. 内部函数 描述 _crol_ 字符循环左移   _cror_ 字符循环右移   _ir ...

  5. C语言中你可能不熟悉的头文件(stdlib.h)

    C语言中你可能不熟悉的头文件<cstdlib>(stdlib.h) C Standard General Utilities Library (header) C标准通用工具库(头文件) ...

  6. 万能头文件#include <bits/stdc++.h>

    最近在做题的时候看到别人的题解发现别人都用这个 突然之间打开新世界的大门 去百度之后才知道#include <bits/stdc++.h>包含了目前所有的c++头文件 也就是说只要用#in ...

  7. Visual Studio中头文件stdafx.h的作用

    在较新版的Visual Studio中,新生成的C++项目文件的的头文件夹下会默认有头文件stdafx.h,而源文件夹下则默认有源文件stdafx.cpp,手动将这些文件删除后,编译时系统还会报错.下 ...

  8. 头文件string.h,cstring与string

    string.h string.h是一个C标准头文件,所有的C标准头文件都形如name.h的形式,通过#include <string.h>可以导入此头文件.之后我们就可以在程序中使用st ...

  9. Linux下的段错误(Segmentation fault)

    Linux开发中常见段错误问题原因分析 1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针.不存在的地址.受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用G ...

随机推荐

  1. PHP清除HTML代码、空格、回车换行符的函数

    清除HTML代码.空格.回车换行符的函数如下 function DeleteHtml($str) { $str = trim($str); $str = strip_tags($str,"& ...

  2. Centos6.8搭建Git服务(git版本可选)

    搭建Git服务器需要准备一台运行Linux的机器,本文以Centos6.8纯净版系统为例搭建自己的Git服务. 准备工作:以root用户登陆自己的Linux服务器. 第一步安装依赖库 [root@lo ...

  3. jquery获取当前select下拉选的属性值

    body中: <li> <select id="select_phone"></select> <input type="but ...

  4. 一个牛人给Java初学者的建议

    学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:618528494  我们一起学Java! 给初学者之一:浅谈Java及应用学java ...

  5. mysql中如何在创建数据库的时候指定数据库的字符集?

    需求描述: 在创建DB的时候指定字符集. 操作过程: 1.使用create database语句创建数据库 mysql> create database if not exists test03 ...

  6. Trie树(字典树)(1)

    Trie树.又称字典树,单词查找树或者前缀树,是一种用于高速检索的多叉树结构. Trie树与二叉搜索树不同,键不是直接保存在节点中,而是由节点在树中的位置决定. 一个节点的全部子孙都有同样的前缀(pr ...

  7. 零基础的人怎么学习Java

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  8. UE4修改自Rama的UDP通信蓝图插件

    UE4.15没有提供蓝图UDP的组件,可以在网上找到一个ID叫Rama写的源代码,我把它封装成插件了(MyUdpPlugin),方便在各个UE4版本工程中使用UDP通信. 使用方式: 1.在自己的工程 ...

  9. ARM漏洞

    Google安全团队Project Zero公布了多个高危漏洞,称这些漏洞几乎影响到了市面上所有的微处理器,AMD.ARM还是英特尔的处理器都难以幸免,围绕这些处理器打造的操作系统和硬件设备也会受到影 ...

  10. Keil(MDK-ARM)在线调试(Ⅰ)(转)

    Ⅰ.写在前面 Keil在线调试的内容有很多,本文带来在线调试常用的内容:Debug Toolbar调试工具栏(复位.全速运行.停止运行.单步调试.逐行调试.跳出调试.运行到光标行.跳转到暂停行.调试窗 ...