1 前言

在进行网络socket编程之前,首先要明白计算机通信的原理。网络socket编程是建立在客户端和服务端之间的相互通信,这就必须要了解到计算机网络的知识。我所写的内容是实现简单的本机之间的相互通信。还可以上升到局域网之间不同pc的通信,甚至是不在同一局域网内的pc之间的相互通信。

2概念梳理
2.1  UNIX下文件I/O
写客户端和服务端程序时,你需要利用C语言的基本语法和UNIX下相关系统调用以及库函数。包括socket,connect,bind,listen,write,read的使用等等。
2.2 计算机网络
实现客户端和服务端通信,必须要弄清楚通信原理,包括TCP/UDP协议,IPV4/IPV6的理解等。对于本例客户端和服务端,他们分别占用着同一ip下不同的端口,所以在进行通信时,必须要弄清楚目的ip目的端口以及源ip源端口。我们需要指定连接服务端的端口,但是客户端的端口不用去指定,因为客户端可以有很多个,可以让linux操作系统内核随机分配,这样会大大减少内存的压力。
2.3 linux基本操作
执行操作时,我们必须要了解在linux命令行下的基本操作才能对我们的pc进行操控,比如gcc的调试和vim的基本使用,这都是非常有必要的。

3代码及运行结果

3.1 服务端程序

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>#define MSG "hello , I am accept\n"void useage(char *progname)
{printf("%s useage:\n",progname);printf("-p(--port):specify server  listen port\n");printf("-h(--help):print this help information\n");return;
}int main(int argc, char **argv)
{int                     sockfd = -1;int                     clifd = -1;int                     rv = -1;struct sockaddr_in      cliaddr;struct sockaddr_in      servaddr;socklen_t               len=1;int                     port=0;char                    buf[1024];struct option           opts[] = {{"port",required_argument,NULL,'p'},{"help",no_argument,NULL,'h'},{NULL,0,NULL,0}};int                     opt;int                     idx;while((opt = getopt_long(argc,argv,"p:h",opts,&idx)) != -1){switch(opt){case 'p':port = atoi(optarg);break;case 'h':useage(argv[0]);return -1;}}if(!port){useage(argv[0]);return 0;}sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd < 0){printf("Create socket failure:%s\n",strerror(errno));return -1;}printf("Create socket[%d] successfully\n",sockfd);memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port=htons(port);servaddr.sin_addr.s_addr = htonl(INADDR_ANY);rv = bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));if(rv<0){printf("socket[%d] bind on port[%d] failure:%s\n",sockfd,port,strerror(errno));return -2;}listen(sockfd,13);//        inet_aton(servip,&servaddr.sin_addr);printf("Connect client successfully:\n");while(1){clifd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);if(clifd<0){printf("Accept new client faliure:%s\n",strerror(errno));continue;}printf("Accept new client[%s:%d] successfully!\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));memset(buf,0,sizeof(buf));rv = read(clifd,buf,sizeof(buf));if(rv < 0){printf("read failure:%s\n",strerror(errno));close(clifd);continue;}else if(rv == 0){printf("socket[%d] get disconnect\n",clifd);close(clifd);continue;}else if(rv > 0){printf("read %dbyte from client:%s\n",rv,buf);}rv = write(clifd,MSG,sizeof(MSG));if(rv < 0){printf("write failure:%s\n",strerror(errno));close(clifd);continue;}printf("close client socket[%d]\n",clifd);close(clifd);}close(sockfd);}

3.1客户端程序(3种写法)

3.1.1 第一种方法---在程序内指定IP和端口

 #include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define MSG_STR "Hello i am zhangkang\n"//添加宏定义,方便write函数中strlen的使用int main (int argc,char *argv[])
{int               sockfd=-1;int               rv=-1;struct sockaddr_in servaddr;//ipv4 结构体的定义;char              *servip="127.0.0.1";//与本机进行通信;  int               port=6666;//指定服务器端口 char              buf[1024];//指定读区sockfd=socket(AF_INET,SOCK_STREAM,0);if (socket<0){printf("Creat socker faliure:%s\n",strerror(errno));return -1;}printf("Creat socket[%d] successful!\n",sockfd);memset(&servaddr,0,sizeof(servaddr));//将定义ipv4的结构体清空;servaddr.sin_family=AF_INET;servaddr.sin_port=htons(port);inet_aton(servip,&servaddr.sin_addr);//写入ipv4结构体中的一些数据;rv=connect(sockfd(struct sockaddr *)&servaddr,sizeof(servaddr));if(rv<0){printf("Connect to server[%s:%d] failure:%s\n",servip,port,strerror(errno));return -2;}printf("Connect to server[%s:%d] successful!",servip,port);while(1){rv=write(sockfd,MSG_STR,strlen(MSG_STR));if(rv<0){printf("Write to server by sockfd[%d] failure:%s\n",sockfd,strerror(errno));break;}memset(buf,0,sizeof(buf));//将buf清空;rv=read(sockfd,buf,sizeof(buf));if(rv<0){printf("Read data from  server by sockfd[%d] failure:%s\n",sockfd,strerror(errno));break;}else if(rv==0){printf("Socket[%d] get disconnected\n",sockfd);break;}else if(rv>0){printf("Read %d bytes data from Server:%s\n",rv,buf);break;}}close(sockfd);

3.1.1.1 第一种方法结果图

客户端:

服务端:

3.1.2 第二种方法--用arg传递IP和端口

#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdlib.h> #define MSG_STR "Hello zhangkang\n"//添加宏定义,方便write函数中strlen的使用int main (int argc,char *argv[])
{int               sockfd=-1;int               rv=-1;struct sockaddr_in servaddr;//ipv4 结构体的定义;char              *servip=NULL; int               port=0;char              buf[1024];//指定读区if(argc<3){printf("program usage: %s [ServerIP] [ServerPORT]\n",argv[0]);return -1;}servip=argv[1];//第二个参数为目的ip;port=atoi(argv[2]);//第三个参数为目的端口;sockfd=socket(AF_INET,SOCK_STREAM,0);if (socket<0){printf("Creat socker faliure:%s\n",strerror(errno));return -2;}printf("Creat socket[%d] successful!\n",sockfd);memset(&servaddr,0,sizeof(servaddr));//将定义ipv4的结构体清空;servaddr.sin_family=AF_INET;servaddr.sin_port=htons(port);inet_aton(servip,&servaddr.sin_addr);//写入ipv4结构体中的一些数据;rv=connect(sockfd(struct sockaddr *)&servaddr,sizeof(servaddr));if(rv<0){printf("Connect to server[%s:%d] failure:%s\n",servip,port,strerror(errno));return -3;}printf("Connect to server[%s:%d] successful!",servip,port);while(1){rv=write(sockfd,MSG_STR,strlen(MSG_STR));if(rv<0){printf("Write to server by sockfd[%d] failure:%s\n",sockfd,strerror(errno));break;}memset(buf,0,sizeof(buf));//将buf清空;rv=read(sockfd,buf,sizeof(buf));if(rv<0){printf("Read data from  server by sockfd[%d] failure:%s\n",sockfd,strerror(errno));break;}else if(rv==0){printf("Socket[%d] get disconnected\n",sockfd);break;}else if(rv>0){printf("Read %d bytes data from Server:%s\n",rv,buf);break;}}close(sockfd);
}   

3.1.2.1第二种方法结果图

客户端:

服务端:

3.1.3第三种方法--利用getopt_long的选项传递IP和端口

#include <stdio.h>#include <errno.h>#include <string.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <getopt.h>#define MSG_STR "Hello i am zhangkang\n"//添加宏定义,方便write函数中strlen的使用void print_useage(char *progname){printf("%s print_useage:\n",progname)printf("-i(--ipaddr):specify server IP address\n");printf("-p(--port):specify server  port\n");printf("-h(--help):print this help information\n");return;}int main (int argc,char *argv[])
{int                sockfd=-1;int                rv=-1;struct sockaddr_in servaddr;//ipv4 结构体的定义;char              *servip=NULL;  int                port=0;char               buf[1024];//指定读区int                opt;int                idx;struct option      opts[] = {{"ipaddr",required_argument,NULL,'i'},{"port",required_argument,NULL,'p'},{"help",no_argument,NULL,'h'},{NULL,0,NULL,0}};while((opt = getopt_long(argc,argv,"i:a:p:h",opts,&idx)) != -1){switch(opt){case 'i':servip = optarg;break;case 'p':port = atoi(optarg);break;case 'h':print_useage(argv[0]);return 0;case 'a':h_alias = optarg;break;}}sockfd=socket(AF_INET,SOCK_STREAM,0);if (socket<0){printf("Creat socker faliure:%s\n",strerror(errno));return -1;}printf("Creat socket[%d] successful!\n",sockfd);memset(&servaddr,0,sizeof(servaddr));//将定义ipv4的结构体清空;servaddr.sin_family=AF_INET;servaddr.sin_port=htons(port);inet_aton(servip,&servaddr.sin_addr);//写入ipv4结构体中的一些数据;rv=connect(sockfd(struct sockaddr *)&servaddr,sizeof(servaddr));if(rv<0){printf("Connect to server[%s:%d] failure:%s\n",servip,port,strerror(errno));return -2;}printf("Connect to server[%s:%d] successful!",servip,port);while(1){rv=write(sockfd,MSG_STR,strlen(MSG_STR));if(rv<0){printf("Write to server by sockfd[%d] failure:%s\n",sockfd,strerror(errno));break;}memset(buf,0,sizeof(buf));//将buf清空;rv=read(sockfd,buf,sizeof(buf));if(rv<0){printf("Read data from  server by sockfd[%d] failure:%s\n",sockfd,strerror(errno));break;}else if(rv==0){printf("Socket[%d] get disconnected\n",sockfd);break;}else if(rv>0){printf("Read %d bytes data from Server:%s\n",rv,buf);break;}}close(sockfd);
}   

3.1.3.1 第三种方法结果图

客户端:

服务端:

UNIX编程—网络socket相关推荐

  1. Python 网络编程(Socket)

    Python 网络编程(Socket) 一.Socket 套接字 1.Socket 编程 socket本质是编程接口(API),对TCP/IP的封装,提供可供程序员做网络开发所用的接口.Socket ...

  2. linux网络编程Internet Socket地址,套接字,和函数

    文章内容节选<linux/UNIX 系统网络编程> Internet domain socket地址有两种:IPv4 IPv6 IPv4被存储在结构体中, 该结构体在 netinet/in ...

  3. 网络socket编程--多路复用

    一.五种网络I/O模型 1.什么是I/O I/O在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常 ...

  4. C++笔记--Linux网络编程(15-0)-socket(供自查,文档说明)

    目录 网络基础 协议的概念 什么是协议 典型协议 网络应用程序设计模式 C/S模式 B/S模式 优缺点 分层模型 OSI七层模型 TCP/IP四层模型 通信过程 协议格式 数据包封装 以太网帧格式 A ...

  5. (转)网络编程:Socket编程从IPv4转向IPv6支持

    目前运行主流的IT系统中,用于解决分布式系统内部模块及不同的系统间通信的一种主要的解决方案就是使用套接字Socket来开发应用.由于当前大部分正在运行的IT系统中使用套接字Socket开发环境基本上都 ...

  6. 网络socket编程指南 (转)

    Beej网络socket编程指南 -------------------------------------------------------------------------------- 介绍 ...

  7. java web接收tcp_Java多线程实现TCP网络Socket编程(C/S通信)

    开篇必知必会 在前一篇<基于TCP协议网络socket编程(java实现C/S通信)>,实际存在一个问题,如果服务器端在建立连接后发送多条信息给客户端,客户端是无法全部接收的,原因在于客户 ...

  8. java基础 day12-FileInputStream类,文件的复制,缓冲流,Propertes文件,xml文件读写,网络socket编程(构建TCP客户端),内部类

    FileInputStream类的其他常用方法() /**在project下新建temp文件,内容为abcdef*FileInputStream类的其他常用方法:* int available():返 ...

  9. 网络编程及socket模块

    目录 1.必备基础 1.1 网络架构 1.1.1 交换机 1.1.2 路由器 1.1.3 三层交换机 1.1.4 小型企业基础网络架构 1.1.5 家庭网络架构 1.1.6 互联网 1.2 网络核心词 ...

最新文章

  1. 初学数位DP--hdu 2089
  2. C项目实践--俄罗斯方块(2)
  3. jsp 中forward 和 Redirect 的用法区别
  4. xmlhttprequest level 2
  5. 科学计算机fx-82es,fx-82ES PLUS A -2卡西欧计算器-计算器 函数科学-卡西欧官方商城...
  6. 教师计算机应用研讨交流,计算机应用技术专业技能比赛研讨交流活动在济南信息工程学校举行...
  7. Notepad++便签模式
  8. QtDesigner如何添加工具栏toolBar
  9. 都是成年人了,别再相信OA价格越低越好这种话了
  10. matlab两个曲线的名称怎么显示出来的,求MATLAB的高手,怎么把两张仿真曲线合并显示在一张图上?...
  11. table表格字母无法换行
  12. 51nod 1106 质数检测
  13. NOIP2015题解
  14. 超级简单的自动刷新_输入名字,自动生成情侣头像~
  15. 进销存管理系统搭建流程
  16. 蛋白组学质谱检测实验
  17. 带你快速入门AXI4总线--AXI4-Full篇(2)----XILINX AXI4-Full接口IP源码仿真分析(Slave接口)
  18. <PrivateImplementationDetails>.ComputeStringHash 错误解决办法
  19. 刘彬20000词汇02
  20. 用友财务软件函数说明

热门文章

  1. 电磁波的频率与波长的关系
  2. CAD2014学习笔记-图纸布局和打印输出
  3. 用户空间的SystemTap探测是怎么工作的
  4. 基于matlab的控制系统与仿真-1
  5. 毕设进程-小程序云开发随笔
  6. 数学智力题 武士数独题目_这5道数学智力题,“虐哭”很多家长,难倒众多大学生...
  7. DSQ无法安装2012版SQL登录失败怎么办?操作“检查系统重新引导是否处于挂起状态”“注册数据质量程序集和存储过程”已完成,但有错误,正在中止安装
  8. 20145307陈俊达_安卓逆向分析_Xposed的hook技术研究
  9. 7月编程排行榜来啦!这次有何新变化?
  10. 一些扩展kmp的总结