【Socket】linux套接字技术之tcp
1.mystery引入
2)网络的本质就是资源共享,当前流行的P2P应用正好暗合了这种精神。
3)当前流行的Web服务,其标准协议是HTTP,很多从事Web应用程序开发的开发者,从事的就是这种应用的网络编程,所采用的开 发模式是浏览器/服务器结构,也称为B/S结构 。
4)B/S结构是C/S结构的一个变种,是指开发者不需要开发独立的客户端软件,浏览器就是此时的客户端,开发者只需要在服务器端编写并部署脚本,资源请求者就可以通过URL进行访问了。
5)Socket提供一种原始套接字机制,能够让开发者直接操纵IP层。
6)利用Socket编程还可以编写出广播和组播应用程序。
7)广播是指向当前局域网所有的在线主机发送数据,ARP协议就是利用广播机制。
8)组播相对广播,也可了理解为广播的一个子集,类似于QQ中的群。
2.源码
服务端:
//TCPServer.c
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define SERVER_PORT 5555
main()
{
int serverSocket;
struct sockaddr_in server_addr;
struct sockaddr_in clientAddr;
int addr_len = sizeof(clientAddr);
int client;
char buffer[];
int iDataNum ;
if((serverSocket = socket(AF_INET,SOCK_STREAM,)) < )
{
perror("socket");
exit();
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family =AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr)) < )
{
perror("connect");
exit();
}
if(listen(serverSocket,)<)
{
perror("listen");
exit();
}
while()
{
client = accept(serverSocket,(struct sockaddr *)&clientAddr,(socklen_t*)&addr_len);
if(client < )
{
perror("accept");
continue;
}
iDataNum = recv(client,buffer,,);
if(iDataNum < )
{
perror("Recv");
continue;
}
printf("\nRecv client data.......\n");
printf("IP is %s\n",inet_ntoa(clientAddr.sin_addr));
printf("Port is %d\n",htons(clientAddr.sin_port));
printf("Recv Data is %s\n",buffer);
send(client,buffer,sizeof(buffer),);
}
}
//TCPClient.c
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
main()
{
struct sockaddr_in serverAddr;
int clientSocket;
char sendbuf[];
char recvbuf[];
if((clientSocket=socket(AF_INET,SOCK_STREAM,)) < )
{
perror( "socket error" );
return -;
}
serverAddr.sin_family=AF_INET;
serverAddr.sin_port=htons();
serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
if(connect(clientSocket,( struct sockaddr * )&serverAddr,sizeof(serverAddr)) < )
{
perror("connect");
exit();
}
printf("connect with destination host.....\n");
while()
{
printf("Input your World:>");
scanf("%s",sendbuf);
printf("\n");
if(strcmp(sendbuf,"quit") == )
break;
send(clientSocket,sendbuf,sizeof(sendbuf),);
recv(clientSocket,recvbuf,,);
printf("recv data of my world is: %s\n",recvbuf);
}
close(clientSocket);
return ;
}
3.mystery注解
1) addr_in存储主机IP地址
2)sockaddr_in用于表示Internet协议簇地址结构
3)sockaddr存储主机IP地址与接口信息
4)addr_in是一个结构体,其中包含一个联合体,其中结构体s_un_b中的4个字段s_b1/s_b2/s_b3/s_b4分别对应IP地址点分法下的4个 值
5)inet_addr()函数的作用是将字符形式的IP地址转换成整数值
6)htons()和htonl()函数用于字节序的转换,表示将数值从主机字节序转换成网络字节序
7)htons()函数是16字节序转换
8)htonl()函数是32字节序转换
【Socket】linux套接字技术之tcp的更多相关文章
- socket - Linux 套接字
总览 #include <sys/socket.h> mysocket = socket(int socket_family, int socket_type, int protocol) ...
- python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用)
先来回顾一下昨天的内容 网络编程开发架构 B/S C/S架构网卡 mac地址网段 ip地址 : 表示了一台电脑在网络中的位置 子网掩码 : ip和子网掩码按位与得到网段 网关ip : 内置在路由器中的 ...
- Linux套接字编程
网络中的进程是如何通信的? 在网络中进程之间进行通信的时候,那么每个通信的进程必须知道它要和哪个计算机上的哪个进程通信.否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行 ...
- iOS - Socket 网络套接字
1.Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 Socket.Socket 又称 "套接字",应用程序通常通过 "套接字& ...
- Win2 Socket(套接字)相关 API
Socket(套接字) 作者信息 肖进 单位:南京中萃食品有限公司 资讯部 邮箱:xiaoj@njb.swirebev.com 电话:025-58642091 与socket有关的一些函数介绍 1.读 ...
- linux 套接字编程入门--Hello World
下述代码是linux套接字编程的入门代码.分为服务端和客户端源码. 服务端代码的主要流程是绑定ip地址和端口号建立套接字,等待客户端发起访问.接受客户端请求之后,向客户端发送字符串"hell ...
- Linux 套接字编程中的 5 个隐患(转)
本文转自IBM博文Linux 套接字编程中的 5 个隐患. “在异构环境中开发可靠的网络应用程序”. Socket API 是网络应用程序开发中实际应用的标准 API.尽管该 API 简单,但是开发新 ...
- 【 Linux 】Linux套接字简要说明
Linux套接字 源IP地址和目的IP地址以及源端口和目标端口号的组合称为套接字.其作用于标识客户端请求的服务器和服务. 套接字,支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间 ...
- Linux 套接字与文件描述符
端口和套接字,用于确定指定主机上的哪个本地进程使用了哪个协议和哪台远程主机上的哪个进程进行了通信.端口和套接字的使用可以基于以下几点: ①为每个应用过程分配一个过程标识符(Process ID),每次 ...
随机推荐
- [翻译]01-ASP.NET MVC 3介绍
前言 -------------------------- 最近,公司新架构使用asp.net mvc5,一直都是看书学习ASP.NET MVC的,书本毕竟是别人翻译过来的,所以里面可能某些地方翻译有 ...
- python web中的并发请求
python web可以选择django,也可以选择flask,它们的原理差不多.flask比较轻量,下面写一段flask程序来说明python web对并发请求的处理. app.py import ...
- [转]解决Eclipse中编辑xml文件的智能提示问题
转自:http://hi.baidu.com/cghroom/item/48fd2d0dc1fc23c675cd3c3e 摘要: Eclipse for Android xml 文件代码自动提示功能 ...
- YAML 语言教程(转载)
用YAML语言读取配置是最快的,之前的suricata中用yaml读取了配置,并且在代码运行期间,对配置进行了维护,所以抽点时间,来了解一下YAML语言编程,下文虽然对YAML语言和JAVAScrip ...
- 老男孩linux实战培训初级班第二次课前考试题
################################################################ 本文内容摘录于老男孩linux实战运维培训中心课前考试题(答案部分) ...
- RFID-RC522 与Arduino的连接
一.前几天在某宝上刚买了个RFID-RC522 ,目标是复制我的门禁卡(看样子没多大希望了).二.各种百度各种谷歌都没找到与Arduino的连接方式. so,分享下我的连接方式,与大家共同进步... ...
- 在Linux下安装RabbitMQ
Installing on RPM-based Linux (CentOS, Fedora, OpenSuse, RedHat) 安装新版本的RabbitMQ出错: centos端口转发神器:soca ...
- VMware Workstation 11
VMware Workstation 11开始只支持Windows7以上的64位系统,VMware Workstation 10.0.6为最后支持32位和XP的系统. 下载地址: VMware Wor ...
- Python 爬虫 解决escape问题
爬取某个国外的网址,遇到的编码问题 ,在前段页面 返回的数据是 亞洲私人珍藏賣,令仝好分享他為此 所傾注的心血與熱愛。 爬虫源码是: url = 'http://www.bonhams.com/auc ...
- Hadoop Map/Reduce 示例程序WordCount
#进入hadoop安装目录 cd /usr/local/hadoop #创建示例文件:input #在里面输入以下内容: #Hello world, Bye world! vim input #在hd ...