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段接受连接 ...
随机推荐
- 【BZOJ4236】JOIOJI [DP]
JOIOJI Time Limit: 10 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description JOIOJI桑是JOI君的叔叔 ...
- .NET Core Data Access
.NET Core was released a few months ago, and data access libraries for most databases, both relation ...
- 纠结于arch+xfce还是xubuntu
现在用的是ubuntu gnome版 http://www.tuicool.com/articles/6r22eyU 现在纠结于arch+xfce还是xubuntu,因为不想在gnome下面搞什么美化 ...
- 【EverydaySport】健身笔记——背部训练
背部训练大致可以分为两种. 1 下拉式动作 躯干纵向上下位移的动作 典型代表 这样的下拉类动作 针对的是背阔肌 也就是两边像翅膀一样的部分 2 垂直于躯干的方向作用 向内拉 主要针对的是,背部的中部 ...
- 64_g5
golang-github-kr-text-devel-0-0.11.git6807e77.f..> 11-Feb-2017 07:48 14250 golang-github-kr-text- ...
- C json实战引擎 二 , 实现构造部分
引言 这篇博文和前一篇 C json实战引擎一,实现解析部分设计是相同的,都是采用递归下降分析. 这里扯一点 假如你是学生 推荐一本书 给 大家 自制编程语言 http://baike.baidu.c ...
- 微信小程序使用canvas绘制图片的注意事项
1.单位换算问题,canvas的尺寸单位是px,所以单位需要做个换算,可以通过wx.getSystemInfo获取屏幕宽高(单位是px),微信小程序无论什么机型,屏幕宽度都是750rpx,因此可以做个 ...
- [Jsoi2011]柠檬
Description Flute 很喜欢柠檬.它准备了一串用树枝串起来的贝壳,打算用一种魔法把贝壳变成柠檬.贝壳一共有 N (1 ≤ N ≤ 100,000) 只,按顺序串在树枝上.为了方便,我们从 ...
- [PAT] 1146 Topological Order(25 分)
This is a problem given in the Graduate Entrance Exam in 2018: Which of the following is NOT a topol ...
- 在Redis集群中使用pipeline批量插入
在Redis集群中使用pipeline批量插入 由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: Pipeline p = ...