linux网络编程 5、线程池、本地socket、offset函数、UDP通信( 五 )


成功: 返回读到的字节数
失败: 返回 -1 设置errno
调用该函数相当于TCP通信的recv+函数
(int , const void *buf,len, int flags,
const*,);
函数说明: 发送数据
参数说明:
? 套接字
? 目的地址
? 目的地址长度
?返回值
成功: 返回写入的字节数
失败: 返回-1,设置errno
UDP的服务器编码流程:
?创建套接字 type=
?绑定ip和端口
?while(1)
收发消–
发消息–
?关闭套接字–close
UDP客户端流程:
?创建套接字–
?while(1)
收发消–
发消息–
?关闭套接字–close
编写udp代码并进行测试
测试:
多开器几个客户端经过测试表明:, udp天然支持多客户端, 这点和TCP不同, TCP需要维护连接.
使用nc命令进行测试: nc -u 127.1 8888
02-.c
//udp客户端#include #include #include #include #include #include #include #include int main(){//创建socketint cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd<0){perror("socket error");return -1;}int n;char buf[1024];struct sockaddr_in serv;serv.sin_family = AF_INET;serv.sin_port = htons(8888);inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);while(1){//读标准输入数据memset(buf, 0x00, sizeof(buf));n = read(STDIN_FILENO, buf, sizeof(buf));//发送数据sendto(cfd, buf, n, 0, (struct sockaddr *)&serv, sizeof(serv));//读取数据memset(buf, 0x00, sizeof(buf));n = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);printf("n==[%d], buf==[%s]\n", n, buf);}//关闭套接字close(cfd);return 0;}
01-.c
//udp服务端#include #include #include #include #include #include #include #include int main(){//创建socketint cfd = socket(AF_INET, SOCK_DGRAM, 0);if(cfd<0){perror("socket error");return -1;}//绑定struct sockaddr_in serv;struct sockaddr_in client;bzero(&serv, sizeof(serv));serv.sin_family = AF_INET;serv.sin_port = htons(8888);serv.sin_addr.s_addr = htonl(INADDR_ANY);bind(cfd, (struct sockaddr *)&serv, sizeof(serv));int i;int n;socklen_t len;char buf[1024];while(1){//读取数据memset(buf, 0x00, sizeof(buf));len = sizeof(client);n = recvfrom(cfd, buf, sizeof(buf), 0, (struct sockaddr *)&client, &len);//将大写转换为小写for(i=0; i
本地通信
通过查询: man 7 unix 可以查到unix本地域通信相关信息:
#
#
int (int , int type, int );
函数说明: 创建本地域

linux网络编程  5、线程池、本地socket、offset函数、UDP通信

文章插图
函数参数:
:or
type: 或者
: 0 表示使用默认协议
函数返回值:
成功: 返回文件描述符.
失败: 返回-1, 并设置errno值.
创建成功以后, 会在内核创建缓冲区, 下图是客户端和服务端内核缓冲区示意图.
int bind(int , const*addr,);
函数说明: 绑定套接字
函数参数:
: 由函数返回的文件描述符
addr: 本地地址
: 本地地址长度
函数返回值:
成功: 返回文件描述符.
失败: 返回-1, 并设置errno值.
需要注意的是: bind函数会自动创建文件, 若在调用bind函数之前文件已经存在, 则调用bind会报错, 可以使用函数在bind之前先删除文件.
{
; /*or */
char [108]; /**/
};
通过man 2 bind, 可以查看bind函数的相关信息, 后面还有示例代码, 可以参考.
本地套接字服务器的流程:
?可以使用TCP的方式, 必须按照tcp的流程
?也可以使用UDP的方式, 必须按照udp的流程
tcp的本地套接字服务器流程:
?创建套接字 (,,0)
?绑定&强转
?侦听
?获得新连接
?循环通信 read-write
?关闭文件描述符 close