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)的更多相关文章

  1. 3、linux下Socket编程-TCP/UDP

    1.什么是Socket 网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符.Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socke ...

  2. Socket编程 Tcp和粘包

    大多数程序员都要接触网络编程,Web开发天天和http打交道.稍微底层一点的程序员,就是TCP/UDP . 对程序员来说,Tcp/udp的核心是Socket编程. 我的浅薄的观点---------理解 ...

  3. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  4. socket编程---TCP

    服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接.在这时如果有个客户端初始化一个Socket,然后连接服务器(connec ...

  5. linux下socket编程-TCP

    网络字节序 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出,接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存,因此,网络数据流的地址应这样规定:先发出 ...

  6. SOCKET 编程TCP/IP、UDP

    TCP/IP 资源:http://download.csdn.net/detail/mao0514/9061265 server: #include<stdio.h> #include&l ...

  7. 网络Socket编程TCP协议例子

    1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...

  8. socket 编程 TCP 实现简单聊天功能【转】

    转自:http://blog.csdn.net/liujia2100/article/details/9006479 版权声明:本文为博主原创文章,未经博主允许不得转载. 各个主要函数的功能: .so ...

  9. socket编程 TCP 粘包和半包 的问题及解决办法

    一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...

  10. python基础之socket编程(TCP三次握手和四次挥手)

    TCP协议中中的三次握手和四次挥手 建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接 ...

随机推荐

  1. ES6 利用集合Set解决数组 交集 并集 差集的问题

    根据阮一峰老师的ES6教程自己体会而写的,希望能给一些朋友有帮助到 let a = new Set([1,2,3,4]) let b = new Set([2,3,4,5,]) 并集 let unio ...

  2. ZooKeeper动态配置(十四)

    概述 在3.5.0发行之前,ZK的全体成员和所有其它的配置参数是静态加载的在启动的时候并且在运行的时候不可变.操作员诉诸于"滚动重启" - 一个手动密集和改变配置文件容易出错的方法 ...

  3. Spark的Shuffle过程介绍

    Spark的Shuffle过程介绍 Shuffle Writer Spark丰富了任务类型,有些任务之间数据流转不需要通过Shuffle,但是有些任务之间还是需要通过Shuffle来传递数据,比如wi ...

  4. python测试rabbitmq简易实例

    生产者 import pika #coding=utf8 credentials = pika.PlainCredentials('guest', '密码') connection = pika.Bl ...

  5. 两台linux服务器之间免密scp,在A机器上向B远程拷贝文件

    两台linux服务器之间免密scp,在A机器上向B远程拷贝文件 操作步骤:1.在A机器上,执行ssh-keygen -t rsa,一路按Enter,不需要输入任何内容.(如有提示是否覆盖,可输入y后按 ...

  6. CSS 竖线颜色渐变

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...

  7. js_开发小技巧记录(一)

    (一) 生成从minNum到maxNum的随机数 <!DOCTYPE html> <html> <head> <meta charset="UTF- ...

  8. hdu 2962 Trucking (二分+最短路Spfa)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others ...

  9. Android中的异常情况

    1.setText()方法中,如果参数是int类型,Android会把它当做是一个id查找,报以下异常,因此解决办法就是将参数转化为String类型 如:setText(num) è setText( ...

  10. 代码回滚:Reset、Checkout、Revert 的选择

    git reset.git checkout 和 git revert 是你的 Git 工具箱中最有用的一些命令.它们都用来撤销代码仓库中的某些更改,而前两个命令不仅可以作用于提交,还可以作用于特定文 ...