【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),每次 ...
随机推荐
- nsTimer的简单用法
//用nstimer的用法 一种用法,要手动加入到NsRunLoop中 NSTimer *time= [NSTimer timerWithTimeInterval: target:self selec ...
- 20 道 Spring Boot 面试题
转自:微信公众号:Java技术栈(id: javastack) 面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段 ...
- c++ 11 override final
C++ 11添加了两个继承控制关键字:override和final. override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名.final阻止类的进一步派生和虚函数的进一步重载
- nfs的优化
总结和测试了一下自己的经验: NFS中的rsize.wsize rsize.wsize对于NFS的效能有很大的影响.wsize和rsize设定了SERVER和CLIENT之间往来数据块的大小,这两个参 ...
- linux sshd ssh 服务的启动和使用
这里使用sshd服务登录到linux系统的方法,不少同学走了弯路,包括我,我一直使用vmware虚拟linux学习使用的,后来windows病毒的原因转入到linux系统中使用 1,sshd服务安装 ...
- php自动获取字符串编码函数mb_detect_encoding(转)
使用 mb_detect_encoding() 函数来判断字符串是什么编码的. 当在php中使用mb_detect_encoding函数进行编码识别时,很多人都碰到过识别编码有误的问题,例如对与GB2 ...
- AndroidStudio 编译异常java.lang.OutOfMemoryError: GC overhead limit exceeded
在build.gradle中的android{}添加如下脚本就可以顺利编译了 dexOptions { incremental true javaMaxHeapSize “4g” }
- Oracle 12C -- purge dba_recyclebin
SQL> create user abce identified by abce; User created. SQL> grant resource,connect to abce; G ...
- 输出当前MySQL的环境变量:
输出当前mysql的环境变量: > MySQL.exe --help >output.txt
- linux文件系统 - 初始化(三)
执行init程序 一.目的 内核加载完initrd文件后,为挂载磁盘文件系统做好了必要的准备工作,包括挂载了sysfs.proc文件系统,加载了磁盘驱动程序驱动程序等.接下来,内核跳转到用户空间的in ...