http://blog.csdn.net/xluren/article/details/8043484#t15

套接字有三种类型

流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字。

1.流式套接字提供面向连接、可靠的数据传输服务,数据按字节流、按顺序收发,保证在传输过程中无丢失、无冗余。TCP协议支持该套接字。

2.数据报套接字,提供面向无连接的服务,数据收发无序,不能保证数据的准确到达。UDP协议支持该套接字。

3.原始套接字原始套接字主要用于一些协议的开发,可以进行比较底层的操作。它功能强大,但是没有上面介绍的两种套接字使用方便,一般的程序也涉及不到原始套接字。

重要的几个结构体:

1.sockaddr

[cpp] view plain copy
  1. struct sockaddr
  2. {
  3. unsigned short sa_family; /* address族, AF_xxx */
  4. char sa_data[14]; /* 14 bytes的协议地址 */
  5. };

sa_family 一般来说,都是“AFINET”。
sa_data 包含了一些远程电脑的地址、端口和套接字的数目,它里面的数据是杂溶在一切的。

由于在设置上面比较麻烦,所以有了一个更清晰的结构体数据

2.struct sockaddr_in

注:“in” 代表 “Internet”

[cpp] view plain copy
  1. struct sockaddr_in
  2. {
  3. short int sin_family; /* Internet地址族 */
  4. unsigned short int sin_port; /* 端口号 */
  5. struct in_addr sin_addr; /* Internet地址 */
  6. unsigned char sin_zero[8]; /* 添0(和struct sockaddr一样大小)*/
  7. };

3.struct in_addr (Internet地址)

struct in_addr
{
 unsigned long s_addr;
};

一些函数:

1.socket

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain , int type , int protocol);

说明:

domain 需要被设置为“AF_INET”;

type为套接字类型;

protocol为协议一般设置为0

2.bind()

#include <sys/types.h>
#include <sys/socket.h>
int bind (int sockfd , struct sockaddr *my_addr , int addrlen) ;
参数说明:
sockfd 是由socket()函数返回的套接字描述符。
my_addr 是一个指向struct sockaddr 的指针,包含有关你的地址的信息:名称、端口和IP 地址,可以将struct sockaddr_in结构体强制类型转换传入。
addrlen 可以设置为sizeof(struct sockaddr)。

3.connect()

#include <sys/types.h>
#include <sys/socket.h>
int connect (int sockfd, struct sockaddr *serv_addr, int addrlen);
参数说明:

sockfd :套接字文件描述符,由socket()函数返回的。
serv_addr 是一个存储远程计算机的IP 地址和端口信息的结构。
addrlen 应该是sizeof(struct sockaddr)。

4.listen()

#include <sys/socket.h>
int listen(int sockfd, int backlog);
参数说明:

sockfd 是一个套接字描述符,由socket()系统调用获得。
backlog 是未经过处理的连接请求队列可以容纳的最大数目。

5.accept()

#include <sys/socket.h>
int accept(int sockfd, void *addr, int *addrlen);
参数说明:

sockfd 是正在listen() 的一个套接字描述符。
addr 一般是一个指向struct sockaddr_in 结构的指针;里面存储着远程连接过来的计算机的信息(比如远程计算机的IP 地址和端口)。
addrlen 是一个本地的整型数值,在它的地址传给accept() 前它的值应该是sizeof(struct sockaddr_in);accept()不会在addr 中存储多余addrlen bytes 大小的数据。如果accept()函数在addr 中存储的数据量不足addrlen,则accept()函数会改变addrlen 的值来反应这个情况。

注:调用成功后返回一个标识符,被send或recv用来进行数据的接收和发送

6.send()

#include <sys/types.h>
#include <sys/socket.h>
int send(int sockfd, const void *msg, int len, int flags);
参数说明:
sockfd 是代表你与远程程序连接的套接字描述符。
msg 是一个指针,指向你想发送的信息的地址。
len 是你想发送信息的长度。
flags 发送标记。一般都设为0(你可以查看send 的man pages 来获得其他的参数值并且明白各个参数所代表的含义,很多时候只要你手不懒,通过linux的man命令可以获得很多详细的说明,另外很多书籍或者博客信息也都是man的中文翻译)。

7.recv()

#include <sys/types.h>
#include <sys/socket.h>
int recv(int sockfd, void *buf, int len, unsigned int flags);
参数说明:
sockfd 是你要读取数据的套接字描述符。
buf 是一个指针,指向你能存储数据的内存缓存区域。
len 是缓存区的最大尺寸。
flags 是recv() 函数的一个标志,一般都为0

到此你可以写出一个简单的c/s模式的通信来了。

c/s模式是面向连接的demo

server端:

[cpp] view plain copy
  1. <span style="font-size:14px;">#include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<netinet/in.h>
  8. #define MAXLINE 4096
  9. int main(int argc, char** argv)
  10. {
  11. int    listenfd, connfd;
  12. struct sockaddr_in     servaddr;
  13. char    buff[4096];
  14. int     n;
  15. if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
  16. {
  17. printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
  18. exit(0);
  19. }
  20. memset(&servaddr, 0, sizeof(servaddr));
  21. servaddr.sin_family = AF_INET;
  22. servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  23. servaddr.sin_port = htons(6666);
  24. if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
  25. {
  26. printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
  27. exit(0);
  28. }
  29. if( listen(listenfd, 10) == -1)
  30. {
  31. printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
  32. exit(0);
  33. }
  34. printf("======waiting for client's request======\n");
  35. while(1)
  36. {
  37. if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
  38. {
  39. printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
  40. continue;
  41. }
  42. n = recv(connfd, buff, MAXLINE, 0);
  43. buff[n] = '\0';
  44. printf("recv msg from client: %s\n", buff);
  45. close(connfd);
  46. }
  47. close(listenfd);
  48. }</span>

client端:

[cpp] view plain copy
  1. <span style="font-size:14px;">#include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<errno.h>
  5. #include<sys/types.h>
  6. #include<sys/socket.h>
  7. #include<netinet/in.h>
  8. #define MAXLINE 4096
  9. int main(int argc, char** argv)
  10. {
  11. int    sockfd, n;
  12. char    recvline[4096], sendline[4096];
  13. struct sockaddr_in    servaddr;
  14. if( argc != 2)
  15. {
  16. printf("usage: ./client <ipaddress>\n");
  17. exit(0);
  18. }
  19. if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  20. {
  21. printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
  22. exit(0);
  23. }
  24. memset(&servaddr, 0, sizeof(servaddr));
  25. servaddr.sin_family = AF_INET;
  26. servaddr.sin_port = htons(6666);
  27. if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
  28. {
  29. printf("inet_pton error for %s\n",argv[1]);
  30. exit(0);
  31. }
  32. if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
  33. {
  34. printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
  35. exit(0);
  36. }
  37. printf("send msg to server: \n");
  38. while(1)
  39. {
  40. fgets(sendline, 4096, stdin);
  41. if( send(sockfd, sendline, strlen(sendline), 0) < 0)
  42. {
  43. printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
  44. exit(0);
  45. }
  46. }
  47. close(sockfd);
  48. exit(0);
  49. }
  50. </span>
  1. fgets(sendline, 4096, stdin);
  2. if( send(sockfd, sendline, strlen(sendline), 0) < 0)
  3. {
  4. printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
  5. exit(0);
  6. }

socket通信之最简单的socket通信相关推荐

  1. socket PHP:详细简单的socket TCP通信PHP实现

    如果你想直接运行程序实现效果:请直接看 3.3 本地服务器及客服端程序 1 背景介绍 目标:我希望通过套接字的TCP传输来搭建一个服务器,这个服务器的作用是:接受多个客户端的连接并完成他们的相互通信. ...

  2. python创建socket对象_python---一个简单的socket

    server端: 1 创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) #family参数代表地址家族,可为AF_IN ...

  3. socket java 服务器端_Java 简单的Socket通讯的服务器端实现

    最近学安卓开发,看到书上这个Socket通讯的实例,按照书上打的时候客户端一直连接不上,可能是网络问题或者虚拟机连接问题,所以就用控制台实现的客户端,这里是服务器端的.话不多说,直接贴代码 impor ...

  4. java 通信 教程_Java实现简单的socket通信教程

    今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...

  5. socket通信 _ 一个简单的群聊系统

    群聊系统要用到通信socket协议,在java中要用到两个类java.net.ServerSocket和 Java.net.Socket.ServerSocket用于创建服务器,而Socket用于创建 ...

  6. 简单的socket通信实现

    一.什么是socket网络通信? socket也称作"套接字",描述了计算机的IP地址和端口,运行在计算机中的程序之间采用socket进行数据通信.通信的两端都有socket,它是 ...

  7. Android简单实现Socket通信,客户端连接服务器后,服务器向客户端发送文字数据

    案例实现的是简单的Socket通信,当客户端(Android客户端)连接到指定服务器以后,服务器向客户端发送一句话文字信息(你可以拓展其它的了) 先看一下服务端程序的实现吧 Server.java i ...

  8. Java Socket实现简单的即时通信

    一.项目简述 这是一个即时通信软件的简单实现,通过自定义协议实现登录.退出等控制命令,即时通信软件需要有服务器端与客户端. 二.自定义协议 1.Protocol协议实体类,封装了消息类型以及发送消息. ...

  9. 使用vb.net开发简单的socket通信

    使用vb.net开发简单的socket通信(环境是visual stdio 2019) 说明 参考文章 实现功能 效果展示 代码 服务端 客户端 总结 说明 之前用vb6编程时都是用的winsock控 ...

最新文章

  1. 数论----gcd和lcm
  2. php a标签 执行js,关于a标签不能调用js方法的小细节,你注意到了么?
  3. 转载:EBS上用过的一些接口表整理信息
  4. ora-01033:oracle initializationg or shutdown in progress
  5. 思考一个问题:如何重现主从备份失败的案例
  6. [视频教程] ubuntu系统下安装最新版的MySQL
  7. 华为手机如何升级鸿蒙系统_华为官方正式公告!鸿蒙手机系统下周发布:普通花粉何时能升级?...
  8. java 导入导出txt文件_Java读取和写入txt文件
  9. float型数据与字节数组的转化
  10. python偶数个数_python基础
  11. 几款炫酷的IDEA皮肤主题,大爱!
  12. PHP学习笔记十九【析构函数】
  13. 32位/64位WIN2003各版本支持内存列表 彻底解决XP系统无法支持4G内存的问题
  14. Milvus 在 AVX-512 与 AVX2 的性能对比
  15. 机械类有哪些好投一些的核心期刊?
  16. 设计一个Triangle类继承自GeometricObject类
  17. openwrt添加SLM750模块驱动
  18. 无视硬件检测直接运行Win10混合现实门户
  19. github在线简历
  20. IKEv2协议报文分片处理

热门文章

  1. 洛谷-P1160 队列安排
  2. 01-JAVA语言基础
  3. python 编码问题之终极解决
  4. [导入]Ajax使用初步
  5. GARFIELD@12-30-2004
  6. linux操作系统好吗_国内可以通过安卓+termux打造出适用手机平板和电脑全平台最好的操作系统...
  7. mysql时间函数总结_MySQL 日期时间函数常用总结
  8. mysql数据库的体系结构包括什么组件_MySQL数据库的体系结构
  9. 手型显示html,css各种手型集合(css禁止手型)
  10. java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)