socket编程(TCP)
1.模型:(图片来自百度百科)
服务端:
1)创建socket对象
int socket(int domain, int type, int protocol)
domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。
0 未定义
1 本地通信
2 IPV4
10 IPV6
type:
1 TCP
2 UDP
3 原始套接字
protocol:一般选择自动选择协议
2)将创建的socket对象与ip,端口绑定
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
sockfd:socket对象描述符
*addr:IP与端口
addrlen:地址空间长度,sizeof()求得
3)监听端口
int listen(int sockfd, int backlog)
sockfd:socket对象描述符
backlog:队列长度
4)接受连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
sockfd:socket对象描述符
*addr:用于返回客户端的协议地址
*addrlen:协议地址的长度
5)通信
ssize_t write(int fd, const void *buf, size_t count)/ssize_t read(int fd, void *buf, size_t count)默认为阻塞方式
ssize_t send(int sockfd, const void *buf, size_t len, int flags))/ssize_t recv(int sockfd, void *buf, size_t len, int flags)
6)关闭
int close(int sockfd)/int shutdown(int sockfd,int how)
how:
0:关闭可读,仍然可写
1:关闭可写,仍然可读
2:关闭读写
客户端:
1)创建socket对象
2)请求连接
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
3)通信
4)关闭连接
2.实例:
1)服务端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h> #define MAXSIZE 4096 int main(int argc, char** argv)
{
int sockfd, connfd;
struct sockaddr_in servaddr;
char buff[MAXSIZE];
int n; if( (sockfd = socket(AF_INET, SOCK_STREAM, )) == - ){
printf("create socket error.\n");
exit();
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(); if( bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -){
printf("bind socket error.\n");
exit();
} if( listen(sockfd, ) == -){
printf("listen socket error.\n");
exit();
} printf("======waiting for client's request======\n");
while(){
if( (connfd = accept(sockfd, (struct sockaddr*)NULL, NULL)) == -){
printf("accept socket error.");
continue;
}
n = recv(connfd, buff, MAXSIZE, );
buff[n] = '\0';
printf("recv msg from client:%s\n", buff);
close(connfd);
}
close(sockfd);
}
2)客户端
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h> #define MAXSIZE 4096 int main(int argc, char** argv)
{
int sockfd, n;
char recvline[MAXSIZE], sendline[MAXSIZE];
struct sockaddr_in servaddr; if( argc != ){
printf("usage: ./client <ipaddress>\n");
exit();
} if( (sockfd = socket(AF_INET, SOCK_STREAM, )) < ){
printf("create socket error.\n");
exit();
} memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons();
if( inet_pton(AF_INET, argv[], &servaddr.sin_addr) <= ){
printf("inet_pton error for %s\n",argv[]);
exit();
} if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < ){
printf("connect error.\n");
exit();
} printf("send msg to server: \n");
fgets(sendline, , stdin);
if( send(sockfd, sendline, strlen(sendline), ) < )
{
printf("send msg erro.\n");
exit();
} close(sockfd);
exit();
}
socket编程(TCP)的更多相关文章
- 3、linux下Socket编程-TCP/UDP
1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...
- Socket编程 Tcp和粘包
大多数程序员都要接触网络编程,Web开发天天和http打交道.稍微底层一点的程序员,就是TCP/UDP . 对程序员来说,Tcp/udp的核心是Socket编程. 我的浅薄的观点---------理解 ...
- Java套接字Socket编程--TCP参数
在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...
- socket编程---TCP
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然后连接服务器(connec ...
- linux下socket编程-TCP
网络字节序 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出 ...
- SOCKET 编程TCP/IP、UDP
TCP/IP 资源:http://download.csdn.net/detail/mao0514/9061265 server: #include<stdio.h> #include&l ...
- 网络Socket编程TCP协议例子
1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...
- socket 编程 TCP 实现简单聊天功能【转】
转自:http://blog.csdn.net/liujia2100/article/details/9006479 版权声明:本文为博主原创文章,未经博主允许不得转载. 各个主要函数的功能: .so ...
- socket编程 TCP 粘包和半包 的问题及解决办法
一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...
- python基础之socket编程(TCP三次握手和四次挥手)
TCP协议中中的三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接 ...
随机推荐
- UVA 10214 Trees in a Wood
https://vjudge.net/problem/UVA-10214 题意:你站在原点,每个坐标位置有一棵高度相同的树,问能看到多少棵树 ans=Σ gcd(x,y)=1 欧拉函数搞搞 #incl ...
- 动态规划:区间DP与环形DP
区间型动态规划的典型例题是石子归并,同时使用记忆化搜索实现区间动归是一种比较容易实现的方式,避免了循环数组实现的时候一些边界的判断 n堆石子排列成一条线,我们可以将相邻的两堆石子进行合并,合并之后需要 ...
- 不使用Tomcat,手写简单的web服务
背景: 公司使用的YDB提供了http的查询数据库服务,直接通过url传入sql语句查询数据-_-||.ydb的使用参照:https://www.cnblogs.com/hd-zg/p/7115112 ...
- Centos下Mysql密码忘记解决办法
1.修改MySQL的登录设置: # vim /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/m ...
- 【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)
题目链接 把线段以斜率为第一关键字,截距为第二关键字升序排序. 然后维护一个单调栈,保证栈中两两线段的交点的\(x\)坐标单调上升就行了.栈中的线段即为所求. #include <cstdio& ...
- VMware 12安装虚拟机Mac OS X 10.10不能上网问题
1:从本机中选择打开连接网络,选择本地连接.如果是无线网可以选择无线网. 1: 2: 控制面板--->网络和共享中心 2:选择属性,点击共享按钮. 3:将internet连接共享下面选项都选中 ...
- bzoj 1296 DP
对于每一行做DP预处理,w[i][j]代表这一行前i个刷j次的最大价值,那么w[i][j]=max(w[i][j],w[k][j-1]+sum[k+1][i]),sum[i][j]为i-j段刷一次最多 ...
- charles & Fiddle
一.Charles Charles是在Mac下常用的截取网络封包的工具,在做移动端开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Charles通过将自己设置成系统的网络访问 ...
- js原生读取json
function showJson(){ var test; if(window.XMLHttpRequest){ test = new XMLHttpRequest(); }else if(wind ...
- Laravel 5.2 数据库迁移和数据填充
一.数据库迁移 Laravel 的数据库迁移提供了对数据库.表.字段.索引的一系列相关操作.下面以创建友情链接表为例. 1. 创建迁移 使用 Artisan 命令 php artisan make: ...