1. /*socket->bind->listen->accept->recv/recvfrom->send/sendto->close
  2.  
  3. 客户端:socket->connect->send/sendto->recv/recvfrom->close
  4.  
  5. 其中服务器端首先建立起socket,然后调用本地端口的绑定,接着就开始与客服端建立联系,并接收客户端发送的消息。
  6. 客户端则在建立socket之后调用connect函数来建立连接。
  7.  
  8. 服务器端的源代码如下所示:*/
  9.  
  10. /*"server.c"*/
  11.  
  12. #include<sys/types.h>
  13. #include<sys/socket.h>
  14. #include<stdio.h>
  15. #include<stdlib.h>
  16. #include<errno.h>
  17. #include<string.h>
  18. #include<unistd.h>
  19. #include<netinet/in.h>
  20.  
  21. #define PORT 3490 //端口
  22.  
  23. #define BUFFER_SIZE 1024 //缓冲区大小
  24.  
  25. #define MAX_QUE_CONN_NM 5 //服务器等待连接队列的最大长度。
  26.  
  27. int main(){
  28.  
  29. struct sockaddr_in server_sockaddr,client_sockaddr; //分别定义服务器和客户端套接字
  30. int sin_size,recvbytes;
  31. int server_fd,client_fd;
  32. char buf[BUFFER_SIZE]; //缓冲区
  33.  
  34. /*
  35. SOCKET PASCAL FAR socket( int af, int type, int protocol);
  36. af:一个地址描述。目前仅支持AF_INET格式,也就是说ARPA Internet地址格式。
  37. type:指定socket类型。新套接口的类型描述类型,如TCP(SOCK_STREAM)和UDP(SOCK_DGRAM)。
  38. 常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。
  39. protocol:顾名思义,就是指定协议。套接口所用的协议。如调用者不想指定,可用0。
  40. 常用的协议有,IPPROTO_TCP、IPPROTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,
  41. 它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
  42. */
  43. if((server_fd = socket(AF_INET,SOCK_STREAM,))== -){ //建立socket连接www.linuxidc.com
  44. perror("create socket fail");
  45. exit();
  46. }
  47.  
  48. printf("Socket id=%d\n",server_fd);
  49.  
  50. /*设置sockaddr_in结构体中的相关参数*/
  51.  
  52. server_sockaddr.sin_family = AF_INET;
  53. server_sockaddr.sin_port = htons(PORT); //由于在写网络程序时字节的网络顺序和主机顺序会有问题
  54. server_sockaddr.sin_addr.s_addr = INADDR_ANY; //即0.0.0.0 任意地址
  55. bzero(&(server_sockaddr.sin_zero),);
  56. int i = ; //允许重复使用本地地址与套接字进行绑定
  57.  
  58. /*int PASCAL FAR setsockopt(SOCKET s,int level,int optname,const char FAR *optval,int optlen);
  59. s:标识一个套接字的描述符。
  60. level:选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。
  61. optname:需设置的选项。
  62. optval:指针,指向存放选项值的缓冲区。
  63. optlen:optval缓冲区长度。
  64. */
  65. setsockopt(server_fd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i));
  66.  
  67. /*
  68. int bind(SOCKET socket, const struct sockaddr *address,
  69. socklen_t address_len);
  70. 参数说明:
  71. socket:是一个套接字。
  72. address:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
  73. address_len:确定address缓冲区的长度。
  74. 返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
  75. */
  76. if(bind(server_fd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr)) == -){ //绑定函数bind
  77. perror("bind fail");
  78. exit();
  79. }
  80.  
  81. printf("Bind success!\n");
  82.  
  83. /*
  84. int PASCAL FAR listen( SOCKET s, int backlog);
  85. S:用于标识一个已捆绑未连接套接口的描述字。
  86. backlog:等待连接队列的最大长度。
  87. */
  88. if(listen(server_fd,MAX_QUE_CONN_NM)== -){ //调用listen函数,创建为处理请求的队列
  89. perror("listen fail");
  90. exit();
  91. }
  92.  
  93. printf("Listening......\n");
  94.  
  95. /*
  96. SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen);
  97. s:套接口描述字,该套接口在listen()后监听连接。
  98. addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。
  99. addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。
  100. */
  101. if((client_fd = accept(server_fd,(struct sockaddr *)&client_sockaddr,&sin_size))==-){//调用accept函数,等待客户端的接
  102. perror("accept fail");
  103. exit();
  104. }
  105.  
  106. printf("server: got connection from %s \n",inet_ntoa(client_sockaddr.sin_addr));
  107.  
  108. memset(buf,,sizeof(buf));
  109. /*
  110. int PASCAL FAR recv( SOCKET s, char FAR* buf, int len, int flags);
  111. s:一个标识已连接套接口的描述字。
  112. buf:用于接收数据的缓冲区。
  113. len:缓冲区长度。
  114. flags:指定调用方式。通常写成0
  115. */
  116. if((recvbytes = recv(client_fd,buf,BUFFER_SIZE,)) == -){//调用recv函数接收客户端的请求
  117. perror("recv fail");
  118. exit();
  119. }
  120.  
  121. printf("Received a message: %s\n",buf);
  122.  
  123. /*向客户起写数据*/
  124. if(write(client_fd,"客户端我收到你发来的数据了,你能收到这句应答吗?\n",)==-)
  125. perror("write error!");
  126.  
  127. close(client_fd);
  128.  
  129. close(server_fd);
  130. exit();
  131. }
  132.  
  133. /*客户端*/
  134. /*client.c 运行方式:./client localhost*/
  135. #include <stdio.h>
  136. #include <stdlib.h>
  137. #include <errno.h>
  138. #include <string.h>
  139. #include <netdb.h>
  140. #include <sys/types.h>
  141. #include <netinet/in.h>
  142. #include <sys/socket.h>
  143. #define PORT 3490
  144. #define MAXDATASIZE 5000
  145. int main(int argc,char **argv)
  146. {
  147. int sockfd,nbytes;
  148. char buf[];
  149. struct hostent *he;
  150. struct sockaddr_in srvaddr;
  151. if(argc!=)
  152. {
  153. perror("Usage:client hostname\n");
  154. exit();
  155. }
  156. /*函数gethostbyname获得指定域名地址所对应的ip地址*/
  157. if((he=gethostbyname(argv[]))==NULL)
  158. {
  159. perror("gethostbyname");
  160. exit();
  161. }
  162. /*创建套接字,返回套接字描述符*/
  163. if((sockfd=socket(AF_INET,SOCK_STREAM,))==-)
  164. {
  165. perror("create socket error");
  166. exit();
  167. }
  168. bzero(&srvaddr,sizeof(srvaddr));
  169. /*用获得的远程服务器进程的ip地址和端口号来填充一个internet套接字地址结构*/
  170. srvaddr.sin_family=AF_INET;
  171. srvaddr.sin_port=htons(PORT);
  172. srvaddr.sin_addr=*((struct in_addr *)he->h_addr);
  173. /*用connect于这个远程服务器建立一个internet连接*/
  174. if(connect(sockfd,(struct sockaddr *)&srvaddr,sizeof(struct sockaddr))==-)
  175. {
  176. perror("connect error");
  177. exit();
  178. }
  179.  
  180. if((send(sockfd,"客户端向服务端发送数据,服务端你收到了吗?",,)) == -)
  181. {
  182. perror("send error");
  183. exit();
  184. }
  185.  
  186. /*调用read函数读取服务器write过来的信息*/
  187. if((nbytes=read(sockfd,buf,MAXDATASIZE))==-)
  188. {
  189. perror("read error");
  190. exit();
  191. }
  192. buf[nbytes]='\0';
  193. printf("read: %s",buf);
  194. close(sockfd);
  195. }

运行方式: gcc -o service service.c

      gcc -o client client.c

     chmod +x service

      chmod +x client

在一个终端运行:./service

在另一个终端运行:./client localhost

服务端输出:

Socket id=3 Bind success! Listening...... server: got connection from 127.0.0.1 Received a message: 客户端向服务端发送数据,服务端你收到了吗?

客户端输出:

read: 客户端我收到你发来的数据了,你能收到这句应答吗?

Linux 网络编程实例的更多相关文章

  1. Linux网络编程实例解析

    **************************************************************************************************** ...

  2. Linux网络编程——原始套接字实例:MAC 头部报文分析

    通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...

  3. linux网络编程_1

    本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...

  4. Linux网络编程入门 (转载)

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  5. [转] - Linux网络编程 -- 网络知识介绍

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  6. 【转】Linux网络编程入门

    (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...

  7. 《转》Linux网络编程入门

    原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...

  8. Linux网络编程(三)

    Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...

  9. linux网络编程基础--(转自网络)

    转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...

随机推荐

  1. 20135319zl字符集报告

    字符集实验 ASCII 首先,查找ZHULI五个字符对应的ASCII码,5a 48 55 4c 49. 然后,用vim打开一个空文档,按下":",输入%!xxd 然后,输入 000 ...

  2. Composer 更换为国内镜像源(Packagist 镜像)

    安装lavavel步骤: 安装composer (需要开启php_openssl扩展,否则报错) (https://getcomposer.org/) 到github下载laravel的最新发行版 ( ...

  3. ASP.NET MVC开发,编辑页面和添加页面基本相同,我们控制器 Add Edit是共用同一个View吗?

    http://q.cnblogs.com/q/51693/ 这种的话,一般公用就好了.,如下的写法: [HttpGet] public ActionResult UserManage(int user ...

  4. activiti教程之示例项目activiti-explorer运行_百度经验

    https://jingyan.baidu.com/article/4e5b3e19107ad091901e249e.html

  5. [opencv] 图像几何变换:旋转,缩放,斜切

    几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定 ...

  6. P1486 [NOI2004]郁闷的出纳员

    P1486 [NOI2004]郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷 ...

  7. jquery.lazyload插件实现图片延迟加载详解

    什么是LazyLoad技术? 在页面上图片比较多的时候,打开一张页面必然引起与服务器大数据量的交互.尤其是对于高清晰的图片,占了几百K的空间.Lazy Load 是一个用 JavaScript 编写的 ...

  8. python---django中权限框架设计

    一:admin下的权限了解 推文:如何正确使用 Django的User Model (一)默认权限表是在自带auth模块,中permission表中 可以使用has_perm方法获取用户是否有这个权限 ...

  9. Spark记录-Scala基础语法

    如果您熟悉Java语言语法和编程,那么学习Scala将会很容易.Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的. 当编写Scala程序时,它可以被定义为通过调用彼此的方法进 ...

  10. 数据结构编程实验——chapter8-采用树结构的非线性表编程

    关于树结构的非线性表编程在数据结构中可以说占据了半壁江山,其中涉及的知识点繁杂,但也是数据结构体现运算优化的核心所在,下面我们将较为初步且系统得讨论数据结构中一系列有关树的表示. 首先我们再次明确树的 ...