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. ClassCastException: org.apache.tomcat.websocket.server.WsServerContainer cannot be cast to javax.websocket.server.ServerContainer

    21:09:22.221 [MessageBroker-3] INFO c.t.s.s.impl.StockNewsServiceImpl - [2017-12-16 21:09:22] execut ...

  2. {转}用ADMM求解大型机器学习问题

    [本文链接:http://www.cnblogs.com/breezedeus/p/3496819.html] 从等式约束的最小化问题说起:                               ...

  3. OnLoad & DOMReady

    window.onload 事件会在页面或图像加载完成后立即触发(即所有元素的资源都下载完毕).如果页面上有许多图片.音乐或falsh,onload事件会迟迟无法触发.所以出现了DOM Ready事件 ...

  4. 【转】CVE-2010-4258 漏洞分析

    一. 漏洞简介 CVE-2010-4258这个漏洞很有意思,主要思路是如果通过clone函数去创建进程,并且带有CLONE_CHILD_CLEARTID标志,那么进程在退出的时候,可以造成内核任意地址 ...

  5. java===java基础学习(14)---封装

    package dog; public class Demo4 { public static void main(String []args) { Worker w1= new Worker(&qu ...

  6. 设计模式之笔记--桥接模式(Bridge)

    桥接模式(Bridge) 定义 桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化. 类图 描述 Abstraction:定义抽象部分的接口,通常在这个接口里面要维护一个实 ...

  7. apache加入chkconfig

    #First Step: cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd #Second Step: vim /etc/init.d/htt ...

  8. 数据类型转换(计算mac地址)

    [root@localhost test1]# vim 19.py //add #!/usr/bin/python macaddr = '00:0C:29:D1:6F:E9' prefix_mac = ...

  9. Unknown character set: 'utf8mb4'

    出现Unknown character set: 'utf8mb4'该错误是因为你的mysql-connector-java版本太高了,现在的mysql编码方式utf8mb4  然而老版本的却是utf ...

  10. java.lang.ClassCastException: org.springframework.web.filter.CharacterEncodingFilter cannot be cast

    严重: Exception starting filter encodingFilterjava.lang.ClassCastException: org.springframework.web.fi ...