MacOs编写一个简单的socket通讯例子

Home / Hackintosh MrLee 2016-3-2 4749

因为目前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://www.it72.com/7900.htm

推荐阅读
最新回复 (0)
返回