什么是socket?

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。其实socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket的作用是用于网络通讯,网络通讯一般指的是不同主机之间的进程通讯,比如我电脑上的qq和你电脑上的qq实现通讯,都是进程之间发送数据.

在本地用pid标识一个进程,在网络中,tcp/ip协议的网络层“ip地址”可以唯一标识网络中的主机,传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

socket服务端编程基本步骤:

1,创建套接字, 利用socket函数

2,绑定套接字: bind

3,监听套件字: listen

4,accept,接收客户端的连接,3次握手就发生在这个阶段,  这个函数返回一个新的套接字

5,处理业务

socket客户端:

1,创建套接字: socket

2,连接服务端: connect

3,处理业务

----------------------------------------------------------------------------------------------------------------------------------

服务端源码:

 #include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h> int main(int argc, char *argv[])
{
int sockfd = -;
int bindres = -;
int listenres = -; sockfd = socket( AF_INET, SOCK_STREAM, );
if ( - == sockfd ) {
perror( "sock created" );
exit( - );
} struct sockaddr_in server;
memset( &server, , sizeof( struct sockaddr_in ) );
server.sin_family = AF_INET;
server.sin_port = ;
server.sin_addr.s_addr = htonl( INADDR_ANY ); bindres = bind( sockfd, (struct sockaddr*)&server, sizeof( server ) );
if( - == bindres ) {
perror( "sock bind" );
exit( - );
} listenres = listen( sockfd, SOMAXCONN );
if( - == listenres ) {
perror( "sock listen" );
exit( - );
} struct sockaddr_in peerServer;
int acceptfd = -;
socklen_t len = sizeof( peerServer );
acceptfd = accept( sockfd, (struct sockaddr*)&peerServer, &len );
if ( - == acceptfd ) {
perror( "sock accept" );
exit( - );
} char recvBuf[];
while( ) {
memset( recvBuf, , sizeof( recvBuf ) );
int recvBytes = read( acceptfd, recvBuf, sizeof( recvBuf ) );
fputs( recvBuf, stdout );
write( acceptfd,recvBuf, recvBytes );
} close( sockfd );
close( acceptfd ); return ;
}

客户端源码:

 #include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h> int main(int argc, char *argv[])
{
int sockfd = -; sockfd = socket( AF_INET, SOCK_STREAM, );
if ( - == sockfd ) {
perror( "sock created" );
exit( - );
} struct sockaddr_in server;
memset( &server, , sizeof( struct sockaddr_in ) );
server.sin_family = AF_INET;
server.sin_port = ;
server.sin_addr.s_addr = inet_addr( "127.0.0.1" ); int res = -;
res = connect( sockfd, (struct sockaddr*)&server, sizeof( server ) );
if( - == res ){
perror( "sock connect" );
exit( - );
} char sendBuf[] = { };
char recvBuf[] = { };
while( fgets( sendBuf, sizeof( sendBuf ), stdin ) != NULL ) {
write( sockfd, sendBuf, sizeof( sendBuf ) );
read( sockfd, recvBuf, sizeof( recvBuf ) );
fputs( recvBuf, stdout );
memset( sendBuf, , sizeof( sendBuf ) );
memset( recvBuf, , sizeof( recvBuf ) );
} close( sockfd ); return ;
}

备注:

1、socket函数的参数:当protocol为0时,会自动选择type类型对应的默认协议

2、将sin_addr设置为INADDR_ANY"的含义是什么?

转换过来就是0.0.0.0,泛指本机的意思,也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。 比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3个ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢? 如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3个ip,也就等于需要管理3个套接字进行数据交换,这样岂不是很繁琐? 所以出现INADDR_ANY,你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,只要是绑定的端口号过来的数据,都可以接收到

linux socket编程:简易客户端与服务端的更多相关文章

  1. socket编程,简单多线程服务端测试程序

    socket编程,简单多线程服务端测试程序 前些天重温了MSDN关于socket编程的WSAStartup.WSACleanup.socket.closesocket.bind.listen.acce ...

  2. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

    单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #inc ...

  3. java Socket通信,客户端与服务端相互发消息

    1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...

  4. Socket编程实践(6) --TCP服务端注意事项

    僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...

  5. TCP Socket 通讯(客户端与服务端)

    /*----------------------------编译环境:VS2015---------------------------------------*/ /*--------------- ...

  6. Socket实例之客户端向服务端数据库上传文件UI版

    http://blog.csdn.net/su20145104009/article/details/52843735 首先实现分析: 1用户注册 客户单选择‘用户注册’,提示要输入用户名,密码,确认 ...

  7. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  8. 二、网络编程-socket之TCP协议开发客户端和服务端通信

    知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的.udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人, ...

  9. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

随机推荐

  1. (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功

    (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功 1.下载opencv 官网http://opencv.org/下载windows版Op ...

  2. Mysql----关于内联,左联,右联,全联的使用和理解

    准备工作:新建两张表 表一:student 填充内容:编号,姓名,班级 表二:school 填充内容:编号,班级,专业 这两张表建好了,意为班级选课表,两张表没有任何主外键的关系,下面进行内联,左联, ...

  3. 》》mui--图片轮播

    mui框架内置了图片轮播插件,通过该插件封装的JS API,用户可以设定是否自动轮播及轮播周期,如下为代码示例: //获得slider插件对象 var gallery = mui('.mui-slid ...

  4. Juel 表达式使用

    JUEL 包的结构例如以下: 1.1.1. Juel maven仓库配置 眼下最新的版本号是2.2.7.使用的时候在pom.xml中加入仓库坐标就可以. <dependency> < ...

  5. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  6. 教女朋友学Python运行环境搭建

    下班比较早,吃了饭没什么事,就和女朋友一起研究了Python. 编程语言有很多,为什么选择它呢?因为它火吧,没什么好解释的,下面开始第一步,环境搭建.网上的教程实在太多,各种系统的各种版本,本地链接下 ...

  7. node.js之路由,中间件,ge请求和post请求的参数

    一.路由 1.什么是路由 服务器需要根据不同的URL或请求来执行不一样的操作,我们可以通过路由来实现这个步骤 2.实现路由的方法 2.1.get请求访问网址时,做什么事 1 app.get(" ...

  8. Struts2.5 伪静态的配置

    伪静态 伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息.或者还想运用动态脚本解决一些问题.不能用静态的方式来展示网站内容.但 ...

  9. Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

    在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...

  10. IDEA快速创建Maven+SpringBoot项目时:Cannot download https://start.spring.io;Status:403

    先展示一下我遇到的问题: 用浏览器搜索是有页面的,但是但是但是呢,用IDEA快速构建的时候就报403 咳咳!巴格虐我万千遍,我待技术如初恋... 我看到的解决办法有以下两种,当然,我只想说:" ...