MAC OS X socket 2 [a simple example]

Xcode->New Workspace

XCode->New Project: C: [Add to : ?]

Server:

code

//
//  main.c
//  s2
//  Server
//  Created by DMD on 4/7/14.
#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>

#define MYPORT  12345
#define QUEUE   20
#define BUFFER_SIZE 1024

//Sever
int main(int argc, const char * argv[])
{
    printf("\nServer:\n");
    ///定义sockfd
    int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);
    if(-1 == server_sockfd)
    {
        printf("initialize socket fail ! \r\n");
        return -1;
    }
    printf("initialize socket ok !\r\n");

    ///定义sockaddr_in
    struct sockaddr_in server_sockaddr;
    server_sockaddr.sin_family = AF_INET;
    server_sockaddr.sin_port = htons(MYPORT);
    server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    ///bind,成功返回0,出错返回-1
    if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
    {
        perror("bind");
        exit(1);
    }
    printf("bind ok !\r\n");  

    ///listen,成功返回0,出错返回-1
    if(listen(server_sockfd,QUEUE) == -1)
    {
        perror("listen");
        exit(1);
    }
    printf("Starting listen......\r\n");
    printf("(Please run Client and input something)\r\n"); 

    ///客户端套接字
    char buffer[BUFFER_SIZE];
    char send_client_buffer[BUFFER_SIZE];
    struct sockaddr_in client_addr;
    socklen_t length = sizeof(client_addr);

    ///成功返回非负描述字,出错返回-1
    int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
    if(conn<0)
    {
        perror("accept connect failed");
        exit(1);
    }
    printf("start accept data from Client...\r\n");    

    while(1)
    {
        memset(buffer,0,sizeof(buffer));
        memset(send_client_buffer,0,sizeof(send_client_buffer));
        //开始接受来自服务器信息
        int len = recv(conn, buffer, sizeof(buffer),0);
        //printf("Client Said,\"%s\"\n",buffer);
        printf("client said:%s",buffer);
        //如果输入"exit",表示让服务器跳出while,即不再接受来自客户端的数据,并且关闭服务器
        if(strcmp(buffer,"exit\n")==0)
        {
            break;
        }
        else if(strcmp(buffer,"100\n")==0)
        {
          sprintf(send_client_buffer,"hello, this is one handred :%s",buffer);
        }
        else if(strcmp(buffer,"30\n")==0)
        {
          sprintf(send_client_buffer,"hello, this is thirty :%s",buffer);
        }
        else
        {
          sprintf(send_client_buffer,"Server repeat you said that is :%s",buffer);
        //将信息输出到屏幕上
        //fputs(send_client_buffer, stdout);
        }
        //将字符串buffer发送给客户端conn里。
        send(conn, send_client_buffer, strlen(send_client_buffer), 0);
        memset(buffer,0,sizeof(buffer));
        memset(send_client_buffer,0,sizeof(send_client_buffer));

    }

    // 关闭连接
    close(conn);
    close(server_sockfd);
    return 0;
}

// end

XCode->New Project: C:

Client:

code

//
//  main.c
//  c2
//  Client
//  Created by DMD on 4/7/14.

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>

#define MYPORT  12345
#define BUFFER_SIZE 1024

//在main函数里面加入参数,会让第一次输入的时候得到一个未知字符。
//int main(int argc, const char * argv[])
int main()
{
    printf("\nClient:\n");

    ///定义sockfd
    int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
    if(-1 == sock_cli)
    {
        printf("initialize socket fail ! \r\n");
        return -1;
    }
    //printf("initialize socket ok !\r\n");
    ///定义sockaddr_in
    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(MYPORT);  ///服务器端口
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");  ///服务器ip

    ///连接服务器,成功返回0,错误返回-1
    if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        perror("connect");
        exit(1);
    }
    printf("Success connect Server IP:%d ,port :%d !\r\n",servaddr.sin_addr.s_addr,servaddr.sin_port);
    printf("Please type something to Server: \r\n");

    char sendbuf[BUFFER_SIZE];
    char recvbuf[BUFFER_SIZE];
    memset(sendbuf,0,sizeof(sendbuf));
    memset(recvbuf, 0, sizeof(recvbuf));

    //客户端:输入字符串到sendbuf,用回车结束
   while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
   {
        //将数据发送到服务器端
        send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
        //如果输入的是exit,就退出
        if(strcmp(sendbuf,"exit\n")==0)
        {
            break;
        }

        //接受来自服务器的反馈信息
        recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
        //将信息输出到屏幕上
        //fputs(recvbuf, stdout);
        printf("%s",recvbuf);

        memset(sendbuf, 0, sizeof(sendbuf));
        memset(recvbuf, 0, sizeof(recvbuf));
  }
    close(sock_cli);
    return 0;
}

Test:

STEP1.Run Server

STEP2.Run Client

in client type:

100 enter

30 enter

hello

Success!

原理图:服务器和客户端通信

END

2014-7-3 by DMD

MAC OS X socket 2 [a simple example],布布扣,bubuko.com

时间: 2024-07-31 08:20:15

MAC OS X socket 2 [a simple example]的相关文章

MAC OS X socket 1 [a simple example]

Server Code C: // // main.c // unix_socket_very_simple_server // // Created by DMD on 4/7/14. /* Function : Server for unix (OS X MAC) */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> // unix socket #include <sys/socke

MAC OS/IOS Socket编程之AsyncSocket

最近在做越狱状态下的IOS后台监控软件,后台守护进程将取得的数据通过TCP发送到服务器,通过查阅资料了解到IOSsocket编程推荐使用公开的类库AsyncSocket,使用该类库极大的方便了socket的操作,下面开始介绍. 1.Socket简介 socket是应用层与TCP/IP协议簇通信的中间软件抽象层,它是一组接口.Socket描述了一个IP.端口对,它简化了程序员的操作,知道对方的IP以及PORT就可以给对方发送消息,再由服务器端来处理发送的这些消息.所以,Socket一定包含了通信的

Mac OS X下MySQL出现Can&#39;t connect to local MySQL server through socket &#39;/tmp/mysql.sock&#39; (2)的问题

网上类似的很多,大都是说修改my.cnf之类的,在我这种情况下不凑效,另外,好多都是Linux下的,试了好久,最后的原因竟然相当简单:MySQL服务没起来. 因为对mysql.sock文件不是很熟,刚开始很大的时间都浪费在了这上面,重装后都不行,后来进入/usr/local/mysql/bin/下使用mysqld启动,出现下面的问题 好吧,我用root启动,结果又出现 Please read "Security" section of the manual to find out ho

[转]在 Mac OS X 终端里使用 Solarized 配色方案

相信长期浸泡在终端和代码的小伙伴们都有一套自己喜爱的配色方案.以前一直在用简单.适合阅读的 Terminal.app 配色方案,换到 MacBook Pro with Retina display 后发现这个配色时间看长了眼睛有点累.不断有人推荐 Solarized,看了一些截图,感觉还不错,决定试一下. Solarized 是目前最完整的 Terminal/Editor/IDE 配色项目,几乎覆盖所有主流操作系统(Mac OS X, Linux, Windows).编辑器和 IDE(Vim,

转-在Mac OS上搭建Python的开发环境

在Mac OS上搭建Python的开发环境 本文转载自:http://www.jb51.net/article/76931.htm 一. 安装python mac系统其实自带了一个python的执行执行环境,用来运行python还行,但是开发可能就不够了,因此我们需要重新安装python.这里有两种方案安装: 1.homebrew 1 brew install python 这个方案比较简单,如果出错的话可以给前面加sudo试试,这个安装的python可能不是最新版. 2.从官网下载安装大家可以

Mac OS X 10.10安装PyQt流程1.0

装PyQt需要三个包:Qt.SIP.PyQt Qt包在http://www.qt.io/download下载,我下的是5.4.0免费版.(注:目前先不要下最新的Qt 5.5.0,虽然这个版本适配Mac OS X 10.10retina屏,但是目前貌似还没有配上它的PyQt包,我刚开始下的Qt 5.5.0结果因为license的原因装不上) sip包和PyQt都在http://www.riverbankcomputing.com下载,我下的都是最新的开发版,分别是sip4.16.8.PyQt-gp

Mac OS X 10.10 Yosemite下安装java、jdk、mysql、maven、idea

Mac OS X Yosemite已经在2014年10月17日正式发布了. 作为一个java开发者,尝鲜第一时间安装了最新版本. 和之前的OS X系统还是有很多不同的.下面主要在java开发环境方面做一个笔记. 1.jdk安装 默认情况下,10.10系统同样没有安装JDK,也不会自动到Apple服务器下载jdk. 这两有两个选择,一是到oracle官网下载最新版(1.8.0_25)的jdk:二是下载苹果官方提供的10.9的1.6.0_65版本jdk, 1.6.0_65版本下载地址:http://

Programming in Go (Golang) – Setting up a Mac OS X Development Environment

http://www.distilnetworks.com/setup-go-golang-ide-for-mac-os-x/#.V1Byrf50yM8 Programming in Go (Golang) – Setting up a Mac OS X Development Environment Published on February 4, 2015 At Distil, we have recently started to use Go (Golang) to expand the

Mac OS系统通过ssh远程连接服务器或VPS,类似window上的putty

Mac OS系统上其实终端Terminal就自带了. 起初,我使用命令 ssh [email protected],它是默认通过port 22的. 而我VPS的ssh端口并不是22,结果连不上,显示:ssh: connect to host localhost port 22: Connection refused 于是我Google了,发现是要改ssh_config,结果改了没有用:又有人说要改ssh.plist,结果改不了. 最后,我运行了ssh,提示有以下指令: usage: ssh [-