21、网络IPC:套接字(2)
来源:互联网 发布:火炬之光2mac 编辑:程序博客网 时间:2024/06/05 15:43
1、数据传输
//发送数据,成功返回发送的字节数//发送成功只能表示数据已经无错误的发送到网络驱动程序上ssize_t send(int sockfd, const void *buf, size_t nbytes, int flags);//sendto可以为无连接的套接字指定一个目标地址//面向连接的套接字连接中隐含目标地址ssize_t sendto(int sockfd, const void *buf, size_t nbytes, int flags, const struct sockaddr *destaddr, socklen_t destlen);//指定多重缓冲区传输数据ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);struct msghdr{ void *msg_name; socklen_t msg_namelen; struct iovec *msg_iov; int msg_iov_len; .....};//接收数据ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);ssize_t recvfrom(int sockfd, void *restrict buf, size_t len, int flags, struct sockaddr *restrict addr, socklen_t *restrict addrlen);ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
2、通信程序-服务器端
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <sys/socket.h>#include <sys/types.h>#include <string.h>#include <arpa/inet.h>int main(int argc, char *argv[]){ struct sockaddr_in clientaddr, serveraddr; int sockfd; int connfd; int addrlen; sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(atoi(argv[2])); inet_pton(AF_INET, argv[1], &serveraddr.sin_addr); bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); listen(sockfd,128); while(1){ addrlen = sizeof(clientaddr); connfd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen); int ret; do{ char buf[1024]; memset(buf, '\0',sizeof(buf)); ret = recv(connfd,buf, sizeof(buf), 0); write(STDOUT_FILENO, buf, strlen(buf)); char dst[128]; printf("from ip:%s\tport:%d\n",inet_ntop(AF_INET, &clientaddr.sin_addr, dst, sizeof(dst)), ntohs(clientaddr.sin_port)); printf("*------------------------*\n"); memset(buf, '\0',sizeof(buf)); read(STDOUT_FILENO, buf, strlen(buf)); send(connfd,buf,sizeof(buf), 0); printf("msg is sent\n"); printf("*------------------------*\n"); }while(ret); close(connfd); } close(sockfd); return 0;}
2、通信程序-客户端
#include <stdio.h>#include <sys/socket.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <arpa/inet.h>#include <sys/types.h>int main(int argc, char *argv[]){ struct sockaddr_in serveraddr; int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(atoi(argv[2])); inet_pton(AF_INET, argv[1], &serveraddr.sin_addr); connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); while(1){ char buf[1024] = { 0 }; read(STDOUT_FILENO, buf, sizeof(buf)); send(sockfd, buf, strlen(buf), 0); printf("msg is sent\n"); printf("*------------------------*\n"); memset(buf, '\0',sizeof(buf)); recv(sockfd,buf, sizeof(buf), 0); write(STDOUT_FILENO, buf, strlen(buf)); char dst[128]; printf("from ip:%s\tport:%d\n",inet_ntop(AF_INET, &serveraddr.sin_addr, dst, sizeof(dst)), ntohs(serveraddr.sin_port)); printf("*------------------------*\n"); } close(sockfd); return 0;}
3、
//设置套接字选项int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);//查看选项的当前值int getsockopt(int socket, int level, int option, void *restrict val, socklen_t *restrict lenp);
4、带外数据:允许更高优先级的数据传输,TCP支持带外数据(称为紧急数据)仅支持一个字节的紧急数据,UDP不支持。TCP支持紧急标记:在普通数据流中紧急数据所在的位置。
阅读全文
0 0
- 21、网络IPC:套接字(2)
- 网络IPC:套接字
- 网络IPC:套接字
- 网络IPC之套接字
- Linux 网络IPC 之套接字
- 第16章 网络IPC:套接字
- 网络IPC:套接字值寻址
- 第十六章 网络IPC:套接字
- UNIX再学习 -- 网络IPC:套接字
- 20、网络IPC:套接字(1)
- UNIX网络编程——网络IPC:套接字
- APUE函数笔记十四: 网络IPC:套接字
- 《UNIX环境编程》第十六章--网络IPC:套接字
- APUE读书笔记-第16章-网络IPC: 套接字
- Unix环境高级编程网络IPC:套接字
- APUE读书笔记------16章 网络IPC:套接字
- apue学习笔记(第十六章 网络IPC:套接字)
- 《UNIX环境高级编程》十六网络IPC:套接字读书笔记
- HTML基础
- 标准C语言第六天
- 10.21/22作业
- TensorFlow保存读取数据
- 信号处理中各种变换的关系图
- 21、网络IPC:套接字(2)
- linux端口开放和端口对外开放
- C realloc函数
- 标准C语言第七天
- 计蒜客 热爱工作的蒜蒜 spfa+dfs
- Unity3D学习笔记1-角色控制
- 参数更新
- 机器学习该怎么入门
- Tire树(字典树、前缀树)的简介和构造