有关socket

Posted 齐天大圣孙悟空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关socket相关的知识,希望对你有一定的参考价值。

socket是网络编程的基础。socket的相关流程和函数接口也比较多。今天暂且把自己目前碰到的做一下记录。后面有时间详细捋一下网络编程。


sendto

相关函数:send, sendmsg, recv, recvfrom, socket
头文件:#include <sys/types.h>   #include <sys/socket.h>

定义函数:int sendto(int s, const void * msg, int len, unsigned int flags, const struct sockaddr * to, int tolen);

函数说明:sendto() 用来将数据由指定的socket 传给对方主机. 参数s 为已建好连线的socket, 如果利用UDP协议则不需经过连线操作. 参数msg 指向欲连线的数据内容, 参数flags 一般设0, 详细描述请参考send(). 参数to 用来指定欲传送的网络地址, 结构sockaddr 请参考bind(). 参数tolen 为sockaddr 的结果长度.

返回值:成功则返回实际传送出去的字符数, 失败返回-1, 错误原因存于errno 中.



socket

#include<sys/types.h>

#include<sys/socket.h>

int socket(int domain, int type, int protocol);

这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。如果函数调用成功,会返回一个标识这个套接字的文件描述符,失败的时候返回-1。

表1 domain的值及含义

名称 含义 名称 含义
PF_UNIX,PF_LOCAL 本地通信 PF_X25 ITU-T X25 / ISO-8208协议
AF_INET,PF_INET IPv4 Internet协议 PF_AX25 Amateur radio AX.25
PF_INET6 IPv6 Internet协议 PF_ATMPVC 原始ATM PVC访问
PF_IPX IPX-Novell协议 PF_APPLETALK Appletalk
PF_NETLINK 内核用户界面设备 PF_PACKET 底层包访问

表2 type的值及含义

名称 含义
SOCK_STREAM Tcp连接,提供序列化的、可靠的、双向连接的字节流。支持带外数据传输
SOCK_DGRAM 支持UDP连接(无连接状态的消息)
SOCK_SEQPACKET 序列化包,提供一个序列化的、可靠的、双向的基本连接的数据传输通道,数据长度定常。每次调用读系统调用时数据需要将全部数据读出
SOCK_RAW RAW类型,提供原始网络协议访问
SOCK_RDM 提供可靠的数据报文,不过可能数据会有乱序
SOCK_PACKET 这是一个专用类型,不能呢过在通用程序中使用

具体使用示例:

_socket_fd = socket(PF_UNIX, SOCK_DGRAM, 0);


结构体:sockaddr

struct sockaddr {

unsigned  short  sa_family;     /* address family, AF_xxx */

char  sa_data[14];                 /* 14 bytes of protocol address */

};


结构体:sockaddr_in

sockaddr_in(在netinet/in.h中定义):

struct  sockaddr_in {

short  int  sin_family;                      /* Address family */

unsigned  short  int  sin_port;       /* Port number */

struct  in_addr  sin_addr;              /* Internet address */

unsigned  char  sin_zero[8];         /* Same size as struct sockaddr */

};

sin_family指代协议族,在socket编程中只能是AF_INET

sin_port存储端口号(使用网络字节顺序)

sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。


sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向

sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,

在最后用进行类型转换就可以了

bzero((char*)&mysock,sizeof(mysock));//初始化

mysock结构体名

mysock.sa_family=AF_INET;

mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

……

等到要做转换的时候用:

(struct sockaddr*)mysock


结构体:socket_un

进程间通信的一种方式是使用UNIX套接字,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。这样做可以避免为黑客留下后门。

1)创建

使用套接字函数socket创建,不过传递的参数与网络套接字不同。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:

 int sockfd;

 sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);

2)绑定

创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而sun_path是本地文件的路径。通常将文件放在/tmp目录下。例如:

 struct sockaddr_un sun;

 sun.sun_family = AF_LOCAL;

 strcpy(sun.sun_path, filepath);

 bind(sockfd, (struct sockaddr*)&sun, sizeof(sun));





--------------------- 

参考:

https://blog.csdn.net/gladyoucame/article/details/8768731 





以上是关于有关socket的主要内容,如果未能解决你的问题,请参考以下文章

socket通信

java实例检查端口是否被占用

网络通信与Socket

分布式理论,架构设计Socket和IO模型

分布式理论,架构设计Socket和IO模型

android做一个简单上传文件的功能,socket连接问题