因为目前Swift还没有自己封装socket库,有第三方开发人员整过库。不过要我们也可以自己动手封装一个。现在是基于Mac OS编写的一个简单的socket服务端和客户端,如果是Swift的话只要写客户端代码,连接,通讯代码一模一样的,不需要改任何东西。
// // main.cpp // OsDemo // // Created by leehom on 16/3/2. // Copyright © 2016年 lee.demo. All rights reserved. // #include#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SERVPORT 3333 /*服务器监听端口号 */ #define BACKLOG 10 /* 最大同时连接请求数 */ #define MAXDATASIZE 10240 /*每次最大数据传输量 */ struct thread_parms{ char name[512]; int what; }; void* _server(void* params){ struct thread_parms* parms = (struct thread_parms*)params; printf("服务端:%s->服务开启中,端口:%d\n",parms->name,parms->what); int sock_fd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */ int sin_size; struct sockaddr_in my_addr; /* 本机地址信息 */ struct sockaddr_in remote_addr; /* 客户端地址信息 */ if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVPORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero),8); if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { perror("bind出错!"); exit(1); } if(listen(sock_fd, BACKLOG) == -1) { perror("listen出错!"); exit(1); } while(true) { sin_size = sizeof(struct sockaddr_in); if((client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, (socklen_t *)&sin_size)) == -1) { perror("accept出错"); continue; } printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr)); if(!fork()) { /* 子进程代码段 */ if(send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) { perror("send出错!"); } close(client_fd); exit(0); } close(client_fd); } return 0; } int _client(){ printf("客户端:开始连接...\n"); int sock_fd; long recvbytes; char buf[MAXDATASIZE]; struct hostent *host; struct sockaddr_in serv_addr; if((host=gethostbyname("127.0.0.1")) == NULL) { herror("gethostbyname出错!"); exit(1); } if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket创建出错!"); exit(1); } serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); serv_addr.sin_addr = *((struct in_addr *)host->h_addr); bzero(&(serv_addr.sin_zero),8); if(connect(sock_fd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) { perror("connect出错!"); exit(1); } if((recvbytes=recv(sock_fd, buf, MAXDATASIZE, 0)) == -1) { perror("recv出错!"); exit(1); } buf[recvbytes] = ' '; printf("Received: %s",buf); close(sock_fd); return 0; } int main(int argc, const char * argv[]) { // insert code here... pthread_t thread_id; struct thread_parms parms; strcpy(parms.name, "ITHTW"); parms.what = SERVPORT; pthread_create(&thread_id,0, &_server, &parms); _client(); pthread_exit(0); return 0; }
收藏的用户(0) X
正在加载信息~
推荐阅读
SpringBoot打Jar包did not assign a file to the build artifact
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10859999
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员