| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 两个进程间的通信之套接字(socket) -> 正文阅读 |
|
[C++知识库]两个进程间的通信之套接字(socket) |
服务器端的代码(serve.c) #include <stdio.h> #include <sys/socket.h> #include <string.h> #include <netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <arpa/inet.h> #include <pthread.h> int init_socket(char* ip , short port)//UDP传输 { ? ? //1.创建一个套接字 ? ? int fd = socket(AF_INET,SOCK_DGRAM,0); ? ? if(fd == -1) ? ? { ? ? ? ? perror("create socket error"); ? ? ? ? return -1; ? ? } ? ? //2指定服务器的IP和端口号 ? ? struct sockaddr_in addr; ? ? addr.sin_family = AF_INET; ? ? addr.sin_port = htons(port); ? ? addr.sin_addr.s_addr = inet_addr(ip);//inet_addr的功能是将一个ip地址字符串转换成一个整数值 ? ? //3.bind ? ? int r = bind(fd,(struct sockaddr*)&addr,sizeof(addr)); ? ? if(r == -1) ? ? { ? ? ? ? perror("bind error"); ? ? ? ? close(fd); ? ? ? ? return -1; ? ? } ? ? return fd; } struct Data { ? ? char *ip; ? ? short port; }; //线程函数1 void *message(void * arg) { ? ? struct Data tem = *(struct Data *)arg; ? ? int flag = 0; ? ? int sock = init_socket(tem.ip,tem.port); ? ? if(sock == -1) ? ? { ? ? ? ? perror("create sock error"); ? ? ? ? return ((void *)-1); ? ? } ? ? struct sockaddr_in Caddr; ? ? socklen_t len = sizeof(Caddr); ? ? printf("------\n"); ? ? while(1) ? ? { ? ? ? ? char buf[1024] = {0}; ? ? ? ? int ret = recvfrom( sock , (void *) buf , 1024 , 0 , (struct sockaddr*) &Caddr, &len ); ? ? ? ? if(ret > 0) ? ? ? ? { ? ? ? ? ? ? flag++; ? ? ? ? } ? ? ? ? if(flag % 10 == 0) ? ? ? ? { ? ? ? ? ? ? ? ? ? ? ? ? printf("%s\n",buf); ? ? ? ? } ? ? ? ? if(flag == 30) ? ? ? ? { ? ? ? ? ? ? char *p = "no"; ? ? ? ? ? ? sendto( sock , (void *)p, strlen(p) , 0 ,(struct sockaddr*) &Caddr , len ); ? ? ? ? ? ? break; ? ? ? ? } ? ? } ? ? close(sock); ? ? return ((void *)0); }
int main(int argc,char* argv[]) { ? ? struct Data num; ? ? num.ip = argv[1]; ? ? num.port = atoi(argv[2]); ? ? pthread_t pid; ? ? pthread_create( &pid , NULL , message , &num ); ? ? pthread_join( pid , NULL );//等待线程码是pid的线程终止才结束。 ? ? return 0; } 客户端的代码(client.c) #include <stdio.h> #include <sys/socket.h> #include <errno.h> #include <string.h> #include <netinet/in.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <arpa/inet.h> #include <fcntl.h> //设置非阻塞 static void set_nonblocking(int sockfd) { ? ? int flag = fcntl( sockfd , F_GETFL , 0 );//获取文件打开方式的标志,标志值含义与open调用一致,0代表RD_ONLY ? ? if(flag < 0 ) ? ? { ? ? ? ? perror("fcntl F_GETFL fail"); ? ? } ? ? if(fcntl( sockfd , F_SETFL , flag | O_NONBLOCK) < 0)//设置文件标志,非阻塞 ? ? { ? ? ? ? perror("fcntl F_SETFL fail"); ? ? } } int main(int argc,char* argv[]) { ? ? int sock = socket(AF_INET,SOCK_DGRAM,0); ? ? if(sock == -1) ? ? { ? ? ? ? perror("create socket error"); ? ? ? ? return -1; ? ? } ? ? //设置为非阻塞 ? ? set_nonblocking(sock); ? ? struct sockaddr_in saddr; ? ? saddr.sin_family = AF_INET; ? ? saddr.sin_port = htons(atoi(argv[2])); ? ? saddr.sin_addr.s_addr = inet_addr(argv[1]); ? ? struct sockaddr_in caddr; ? ? socklen_t len = sizeof(caddr); ? ? char *buf = "I'm send to you!"; ? ? char bug[100] = {0}; ? ? while(1) ? ? { ? ? ? ? int r = sendto(sock , buf , strlen(buf) , 0 ,(struct sockaddr*)&saddr , sizeof(saddr)); ? ? ? ? if(r > 0) ? ? ? ? { ? ? ? ? ? ? sleep(2); ? ? ? ? } ? ? ? ? printf("client:----\n"); ? ? ? ? ? ? ? ? int ret = recvfrom( sock , bug , 100 , 0 ,(struct sockaddr*)&caddr , &len);//recvfrom是阻塞的 ? ? ? ? if(ret > 0) ? ? ? ? { ? ? ? ? ? ? break; ? ? ? ? } ? ? } ? ? return 0; } |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:57:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |