最近写了一些Linux下网络编程的一些程序,做几点总结吧。

先给出客户端后服务器的一些Socket初始化的代码,以后可以直接拿来调用。

客户端Socket初始化代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <time.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/time.h>
#define IP "192.168.1.111"
#define PORT 12346
int init_socket()
{struct sockaddr_in server_addr;int err;int client_socket;client_socket=socket(AF_INET,SOCK_STREAM,0);if(client_socket<0){printf("socket erro\n");return ;}//设置服务器端的地址,端口等server_addr.sin_family=AF_INET;server_addr.sin_addr.s_addr=inet_addr(IP);//字符串类型转IP类型server_addr.sin_port=htons(PORT);bzero(&(server_addr.sin_zero),8);connect(client_socket,(struct sockaddr *)&server_addr,sizeof(struct sockaddr));//连接服务器return client_socket;
}

直接调用上面的函数返回一个套接字的文件描述符,利用它便可以和服务器进行通信。

下面给出服务器socket初始化的代码

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
#include <openssl/des.h>
#include <sys/time.h>
#include <fcntl.h>
#define PORT 12346
#define BACKLOG 20
int init_server_socket()
{int server_socket,server_client_socket;struct sockaddr_in server_addr;int err;//创建套接字server_socket=socket(AF_INET,SOCK_STREAM,0);if(server_socket<0){printf("socket error\n");return -1;}//设置服务器端的地址,端口等server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);server_addr.sin_addr.s_addr = htons(INADDR_ANY);bzero(&(server_addr.sin_zero), 8);//将创建的套接字绑定到服务器端err = bind(server_socket, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));if(err<0){printf("bind error\n");return -1;}//监听套接字err=listen(server_socket,BACKLOG);if(err<0){printf("listen error\n");return -1;}return server_socket;
}

上面的初始化函数返回了一个套接字文件描述符,我们在服务器程序中,可以写一个循环,当有客户端连接请求的时候,服务器就建立一个线程和服务器进行通信。代码如下所示:

while(1){int addrlen=sizeof(struct sockaddr);struct sockaddr_in client_addr;//如果调用成功,将返回一个新的套接字与客户端通信server_client_socket=accept(server_socket,(struct sockaddr*)&client_addr,&addrlen);//下面两行是将这个socket连接设置成非阻塞模式// int flags = fcntl(server_client_socket, F_GETFL, 0);// fcntl(server_client_socket, F_SETFL, flags | O_NONBLOCK);printf("%s has connected success\n",inet_ntoa(client_addr.sin_addr));//在这里写创建线程程序。。。。。。usleep(100);}

要点总结:

1、在服务器端程序要判断recv()函数的返回值,如果对方发送的数据比较的则需采用循环接收的方法,比如对方一次发了4096字节的数据,一次rrecv()可能接收不了,则需要多次接收,直到接收的总数等于4096字节,看下面的代码你就会明白

#define MAXBUFFER_SIZE 4096
int total_reieved =0;
char recvbuffer[MAXBUFFER_SIZE];
while(1){if(MAXBUFFER_SIZE==total_reieved)break;int size=recv(server_client_socket,recvbuffer+total_reieved,MAXBUFFER_SIZE-total_reieved,0);total_reieved+=size;}

2、如果发送方的程序关闭了,在接收方就会不断recv()并返回0,则我们就要关闭这个连接,防止接收方陷入死循环

3、拔网线拔掉重新插上,socket可以自动恢复连接

4、默认的连接时阻塞模式的,如果要将套接字通信设置成非阻塞模式我们可以参考下面的代码(对套接字文件描述符设置),非阻塞模式下如果读不到数据则返回-1,网络断开也是返回-1

int flags = fcntl(server_client_socket, F_GETFL, 0);
fcntl(server_client_socket, F_SETFL, flags | O_NONBLOCK);

5、假如客户端程序一直发送数据,服务器程序一直接受数据,这时服务器程序关闭,则客户端程序也会关闭,这时因为服务器close一个连接时,若客户端接这发数据,系统会产生一个SIGPIPE信号,告诉进程连接已经断开了,而处理这个信号的默认动作是使进程退出,如果不想进程退出,可以把SIGPIPE设为SIG_IGN。调用函数signal(SIGPIPE,SIG_IGN);

大概就总结了这几点,欢迎批评和指正。

转载于:https://www.cnblogs.com/dyllove98/archive/2013/06/09/3129883.html

Linux Socket编程的一些总结相关推荐

  1. linux socket 编程

    socket  <script type="text/javascript"> </script> <script type="text/j ...

  2. Linux Socket编程

    IP socket 是在其上建立高级Internet 协议的最低级的层:从HTTP到SSL到POP3到Kerberos再到UDP-Time,每种Internet协议都建立在它的基础上.为了实现自定义的 ...

  3. Windows Socket和Linux Socket编程的区别

    2019独角兽企业重金招聘Python工程师标准>>> 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2. ...

  4. Linux Socket编程入门——浅显易懂

    文章目录 1. 概述 2. Socket 3. 网络字节序 4. sockaddr 数据结构 5. 网络套接字API函数  5.1 socket()  5.2 bind()  5.3 listen() ...

  5. linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决

    在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...

  6. 【Linux Socket 编程入门】05 - 拉个骡子溜溜:TCP编程模型代码分析

    (一) 看看以前学了啥 前面介绍了socket的分类,IP地址,端口号(port),常用的socket数据结构以及常用的函数.现在我们来看一个例子,看看socket编程究竟是什么. (二) 一图看懂客 ...

  7. linux socket编程epoll模型实现群发消息

    1.实现功能 本代码主要实现了socket编程epoll模型实现多个客户端连接服务器,客户端可以进行群发消息和接收用户输入文本信息,然后发送该信息给服务器,服务器收到后发送应答信息.客户端接收并显示该 ...

  8. Linux Socket编程(不限Linux)

    我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web 服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠s ...

  9. 【Linux网络】Linux Socket编程 TCP协议

    话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程 ...

最新文章

  1. css设置元素继承父元素宽度_CSS设置超链接A标签宽度和高度
  2. MyEclipse2014安装svn插件
  3. java正则 找出数字,Java顶用正则表达式找出数字
  4. Boost:是否支持sse2指令的测试程序
  5. 华为堡垒机_运维堡垒机----Gateone
  6. tar -zxvf命令_Linux压缩命令小记
  7. 高德地图怎么搜索marker_百度、高德、腾讯地图坐标认证怎么弄,3分钟轻松自助认证...
  8. 查询当天交易总额最大的用户信息_场内场外交易
  9. python之修改pip为阿里源
  10. oracle判断为周一_oracle sql技巧:取上周一到上周日(本周一到本周日\下周一到下周日)的时间...
  11. Kd-tree的学习
  12. Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)
  13. win10更改登录密码
  14. OUTLOOK 下邮件如何以人,文件夹来分类inbox
  15. U盘中毒后文件夹变成exe怎么办
  16. 一行代码实现随意编辑网页内容
  17. 洛谷B2099 矩阵交换行(swap函数)
  18. java如何获取storage_本地化存储Storage
  19. 一、安装Centos
  20. html的悬停图片圆形,css3炫酷圆形图片鼠标滑过特效

热门文章

  1. mysql压缩表语句_MYSQL静态表、动态表、压缩表总结
  2. 七段式svpwm和5段式的区别_五段和七段SVPWM的比较分析.pdf
  3. deepin关机卡桌面_喜大普奔:发现一个惊艳的电脑操作系统Deepin
  4. 安装linux办公软件,Centos7如何安装开源办公软件Libreoffice
  5. anaconda3配置环境变量_Python:Anaconda安装及LabelMe配置(1)
  6. 池州市计算机专科,2021年3月安徽省池州市计算机等级考试时间
  7. 慢就是快的人生哲理_家里的防臭地漏下水慢怎么办?
  8. angular 触发 enter事件
  9. html2canvas 截图div_浏览器端网页截图方案详解
  10. C++知识点6——数组与指针初步