网络IPC:套接字

用socket实现两个不同的主机之间的通信(涉及到一些基本的计算机网络知识  略过。。)

服务器端:

1.socket函数:生成一个套接字

int socket(int domain,int type,int protocol);

参数解析:domain:{AF_INET:Ipv4网络协议,AF_INET6:Ipv6网络协议}

type:{tcp:SOCK_STREAM,udp:SOCK_DGRAM}

protocol:指定socket所使用的传输协议编号,,一般为0;

2.bind函数

将套接字与地址关联

int bind(int sockfd,const struct sockaddr *addr,socklen_t len);

sockfd:套接字      *addr:地址结构的地址    len:地址结构的长度

IPV4中,套接字地址用结构sockaddr_in表示:

struct sockaddr_in {

sa_family_t sin_family;  //通信域,一般为AF_INET

in_port_t sin_port;       //接口地址,二进制

struct in_addr sin_addr; //iP地址,二进制

}

3.listen函数:使服务器ip和这个端口处于监听状态,如果网络中某一客户机有连接请求,则接受请求。

int listen(int sockfd,int backlog);

sockfd:套接字   backlog:服务器能接受的最大请求,一般为10,最大为128

4.accpet函数:接受客户端的请求,建立与客户机端的通信连接。当服务器处于监听状态时,客户端有连接请求,服务器不会马上处理,而是把这一个请求添加到等待队列中去,等到服务器空闲时再处理。处理时会生成一个新的套接字,这个套接字用于服务器和该客户端进行通信。原来的那个socket套接字继续用于监听。

int accept(int s,struct sockaddr *addr,int *addrlen)

s:socket返回值   addr:结构体指针变量,和bind是同种类型(系统会把远程客户机的IP和端口号放到这个指针变量中去)   addrlen:结构体长度

成功的话返回的值是新的socket套接字

5.recv函数:用新的套接字来接受远程客户端所传来的数据,并且将数据存储到参数buf中去

原型:int recv(int sockfd,void *buf,int len,unsigned int flags);

参数:sockfdà为前面accept的返回值.即new_fd,也就是新的套接字。

bufà表示缓冲区

lenà表示缓冲区的长度

flagsà通常为0

成功会返回接受数据的长度。

6.send函数:用新的套接字发送数据给远程客户端

原型:int send(int s,const void * msg,int len,unsigned int flags);

参数:s为前面accept的返回值.即new_fd

msg一般为常量字符串

len表示长度

flags通常为0

客户端:

1. connect函数:用来请求连接远程服务器,将参数sockfd 的socket 连至参数serv_addr 指定的服务器IP和端口号上去。

原型:int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

参数:sockfd为前面socket的返回值,即sfd

serv_addr为结构体指针变量,存储着远程服务器的IP与端口号信息。

addrlen表示结构体变量的长度

返回值:成功则返回0,失败返回-1

2.close函数:当使用完文件后若已不再需要则可使用close()关闭该文件,并且close()会让数据写回磁盘,并释放该文件所占用的资源

原型:int close(int fd);

参数:fd为前面的sfd,new_fd

返回值:若文件顺利关闭则返回0,发生错误时返回-1

sample:一个简单的通信过程。ps:该程序没有用recv函数和send函数,而是用了read和write函数

服务器端:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
int main(int argc,char *argv[])
{
int fd_listen;
fd_listen=socket(AF_INET,SOCK_STREAM,);//套接字 if(fd_listen==-)
{
perror("socket");
exit();
}
struct sockaddr_in seraddr; //地址结构体
memset(&seraddr,,sizeof(seraddr));
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons();//端口
seraddr.sin_addr.s_addr=inet_addr("192.168.1.182");//ip地址
if(-==bind(fd_listen,(const struct sockaddr*)&seraddr,(socklen_t)sizeof(seraddr)))
{
perror("bind");
close(fd_listen);
exit();
}
listen(fd_listen,); //监听函数 struct sockaddr_in peeraddr;
memset(&peeraddr,,sizeof(peeraddr));
socklen_t len=sizeof(peeraddr);
int fd_peer=accept(fd_listen,(struct sockaddr*)&peeraddr,&len); printf("who:%s:%d\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));
if(fd_peer==-)
{
perror("accept");
close(fd_listen);
exit();
}
char buf[]="";
int readn=read(fd_peer,buf,);//从新套接字中读取数据
printf("readn:%d,msg:%s\n",readn,buf);
char *p="-------------------";
write(fd_peer,p,strlen(p));
close(fd_listen);
close(fd_peer);
return ;
}

客户端:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
int main(int argc,char *argv[])
{
int sfd=socket(AF_INET,SOCK_STREAM,);
if(sfd==-)
{
perror("socket");
exit();
}
struct sockaddr_in peeraddr;
peeraddr.sin_family=AF_INET;
peeraddr.sin_port=htons();
peeraddr.sin_addr.s_addr=inet_addr("192.168.1.182"); if(-==connect(sfd,(struct sockaddr*)&peeraddr,sizeof(peeraddr)))//请求连接,把自己的信息添加到套接字中去
{
perror("connect");
close(sfd);
}
char *p="hello world";
write(sfd,p,strlen(p));
char buf[]="";
int readn=read(sfd,buf,);
printf("readn:%d: %s\n",readn,buf);
close(sfd);
return ;
}

总结:本程序模拟TCP协议实现了服务器端和客户机端的简单通信,介绍了整个过程。

基本的socket编程的介绍的更多相关文章

  1. <转>Socket编程——基础介绍

    最近系统的看了下unix网络编程的一些内容,对socket的理解有了进一步的加深,在看APUE的时候,那会儿看socket上面介绍的比较少,只是模糊的懂了如何去写一个简单的TCP服务端和客户端,对其中 ...

  2. python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  3. 转:python socket编程详细介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  4. Python Socket 编程详细介绍(转)

    Python 提供了两个基本的 socket 模块: Socket 它提供了标准的BSD Socket API. SocketServer 它提供了服务器重心,可以简化网络服务器的开发. 下面讲解下 ...

  5. Python 006- python socket编程详细介绍

    转自https://blog.csdn.net/rebelqsp/article/details/22109925 Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供 ...

  6. python socket编程函数介绍

    网上看到一个socket中常用函数的介绍,记录一下 https://blog.csdn.net/rebelqsp/article/details/22109925

  7. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  8. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍   Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...

  9. python socket 编程简单入门

    想讲讲套接字的概念 套接字,即英文socket的中文意译,起源于20世纪70年代,是加利福利亚大学的伯克利版本UNIX(称为BSD UNIX)的一部分.目的是实现主机上运行的一个程序与另一个运行的程序 ...

随机推荐

  1. Asp.Net Core Use MongoDB

    前几天在网上想找一下Asp.Net Core使用MongoDB相关的文章,也看了几篇,发现都是在写简单的例子,这样的例子是不能用在生产环境的,不能用的生产环境的.封装一个东西一定是建立在你对这个东西足 ...

  2. [学习OpenCV攻略][007][缩小图片]

    cvPryDown(输入图片,输出图片) 根据输出图片的大小,把输入图片进行压缩 cvPryUp(输入图片,输出图片) 根据输出图片的大小,把输入图片进行放大 #include "cv.h& ...

  3. 前端通信:SSE设计方案(二)--- 服务器推送技术的实践以及一些应用场景的demo(包括在线及时聊天系统以及线上缓存更新,代码热修复案例)

    距离上一篇博客,这篇文章的发布大概过了整整三个月.我也从饿了么度过了试用期,成为了正式员工.刚进来恰好遇到项目底层改造和迁移,将项目从angular全部迁移到vue上,所以适应这边的节奏和业务的开发任 ...

  4. Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config解决

    出现这个问题往往伴随  HTTP-500错误 报错信息: HTTP Status - Handler processing failed; nested exception is java.lang. ...

  5. 提交到svn服务器时,一直缓冲不,

    1,服务器端url问题,正常:https://192.168.1.102:8443/svn/dedegls/                                   错误:https:// ...

  6. IT项目角色标准定义

    角色 角色标准定义 项目主管 负责协助项目经理分配资源,确定优先级,协调公司和项目组之间的沟通.保证项目团队一直处于良好的状态中.同时监督项目经理的工作方法,以确保项目以及工件符合公司的发展方向以及用 ...

  7. ADO.NET复习总结(4)--访问SqlServer的类

    1.连接SqlConnection 2. 3.执行命令SqlCommand 4.数据读取SqlDataReader  注意: ExecuteNonQuery() :执行非查询(增删改) Execute ...

  8. Hi,WeTest限免开放Android Oreo云真机,Android 8.1可开测!

    2017年末,谷歌在印度正式发布 Android Oreo 8.1,向实现"为所有人打造由 AI 驱动的全覆盖移动平台"这一愿景迈进.Android 8.1在引入对 Android ...

  9. java1.8--Null Object模式

    整理这篇博客是因为现在在整理java8中的optional,所以觉得很有必要整理下Null Object模式.java.lang.NullPointerException,只要敢自称Java程序员,那 ...

  10. Ubuntu 安装 Nginx 实现反向代理

    安装Nginx依赖库(ubuntu平台) 最近域名通过了备案, 想着应用总不能带着端口号访问吧, 于是在网上踩了很多坑, 终于找到了一步直达的方法,起码这一次很顺利的实现了 安装gcc g++的依赖库 ...