因为目前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;
}
本文链接:https://it72.com/7900.htm