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段接受连接 ...
随机推荐
- 【设计模式】 模式PK:包装模式群PK
1.概述 我们讲了这么多的设计模式,大家有没有发觉在很多的模式中有些角色是不干活的?它们只是充当黔首作用,你有问题,找我,但我不处理,我让其他人处理.最典型的就是代理模式了,代理角色接收请求然后传递到 ...
- 洛谷P2868 [USACO07DEC]观光奶牛 Sightseeing Cows
题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...
- UIActivityIndicatorView---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址: iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIActivityIndicatorViewactivityIndicatorVi ...
- jQuery操作Table学习总结[转]
<style type="text/css"> .hover { } </style>< ...
- js跨域上传文件 iframe
封装好的jq插件 (function () { var iframe = '<iframe name="jqUploadIframe" style="display ...
- hdu 1272 小希的迷宫(并查集+最小生成树+队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) ...
- python模块(requests,logging)
一.requests Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythone ...
- pillow模块的学习
https://github.com/wangbinyq/pillow_example http://pillow.readthedocs.org/en/latest/handbook/tutoria ...
- Percona XtraDB Cluster(PXC)原理
Percona XtraDB Cluster(PXC)原理 介绍: PXC曾经属于一套近乎最完美的mysql高可用集群解决方案(现mgr总体上要优于pxc),相比传统的基于主从复制模式的集群架构MHA ...
- 【bzoj2006】NOI2010超级钢琴
补了下前置技能…… 题意就是求一段区间的权值和前k大的子序列的和. 把段扔进优先队列 每次拿出来之后按照所选择的j进行分裂 #include<bits/stdc++.h> #define ...