安岽旭 發表於 2019-6-20 10:32:00

Linux下实现客户端和服务器端的通信

<p>首先,可以将代码复制下来放到U盘里,然后挂载到Linux上</p>
<p>挂载步骤</p>
<p>找到设备-&gt;USB-&gt;你U盘的名字</p>
<p><img src="https://img2018.cnblogs.com/blog/1490994/201906/1490994-20190620102156865-214395316.png"></p>
<p>&nbsp;</p>
<p>挂载成功</p>
<p><img src="https://img2018.cnblogs.com/blog/1490994/201906/1490994-20190620102251437-13453596.png"></p>
<p>访问U盘把代码拷贝到home文件夹下,就可以直接进行编译。</p>
<p>client.c&nbsp;</p>
<div class="cnblogs_code">
<pre>    #include &lt;stdio.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;unistd.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;strings.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include</span>&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;sys/types.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;sys/socket.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;stdlib.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;netinet/<span style="color: rgba(0, 0, 255, 1)">in</span>.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;netdb.h&gt;      

    <span style="color: rgba(0, 0, 255, 1)">#define</span> PORT 1234   
    <span style="color: rgba(0, 0, 255, 1)">#define</span> MAXDATASIZE 100

    <span style="color: rgba(0, 0, 255, 1)">char</span> receiveM[<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">char</span> sendM[<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">];

    </span><span style="color: rgba(0, 0, 255, 1)">int</span> main(<span style="color: rgba(0, 0, 255, 1)">int</span> argc, <span style="color: rgba(0, 0, 255, 1)">char</span> *<span style="color: rgba(0, 0, 0, 1)">argv[])
{
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> fd, numbytes;   
    </span><span style="color: rgba(0, 0, 255, 1)">struct</span> hostent *<span style="color: rgba(0, 0, 0, 1)">he;      
    </span><span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in server;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检查用户输入,如果用户输入不正确,提示用户正确的输入方法</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (argc !=<span style="color: rgba(128, 0, 128, 1)">2</span>) {         printf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Usage: %s &lt;IP Address&gt;\n</span><span style="color: rgba(128, 0, 0, 1)">"</span>,argv[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过函数 gethostbyname()获得字符串形式的ip地址,并赋给he</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> ((he=gethostbyname(argv[<span style="color: rgba(128, 0, 128, 1)">1</span>]))==<span style="color: rgba(0, 0, 0, 1)">NULL){
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">gethostbyname() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }


    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 产生套接字fd</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> ((fd=socket(AF_INET, SOCK_STREAM, <span style="color: rgba(128, 0, 128, 1)">0</span>))==-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">socket() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    bzero(</span>&amp;server,<span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(server));

    server.sin_family </span>=<span style="color: rgba(0, 0, 0, 1)"> AF_INET;
    server.sin_port </span>=<span style="color: rgba(0, 0, 0, 1)"> htons(PORT);
    server.sin_addr </span>= *((<span style="color: rgba(0, 0, 255, 1)">struct</span> in_addr *)he-&gt;<span style="color: rgba(0, 0, 0, 1)">h_addr);
    </span><span style="color: rgba(0, 0, 255, 1)">if</span>(connect(fd, (<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *)&amp;server,<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr))==-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">connect() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }



    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向服务器发送数据</span>
<span style="color: rgba(0, 0, 0, 1)">

    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">send message to server:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

      fgets(sendM,</span><span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">,stdin);
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> send_le;
      send_le</span>=<span style="color: rgba(0, 0, 0, 1)">strlen(sendM);
    sendM=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;





      send(fd,sendM,strlen(sendM),</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 从服务器接收数据</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> ((numbytes=recv(fd,receiveM,MAXDATASIZE,<span style="color: rgba(128, 0, 128, 1)">0</span>)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">recv() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }

      printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">receive message from server:%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,receiveM);

    close(fd);


}</span></pre>
</div>
<p>server.c</p>
<div class="cnblogs_code">
<pre>    #include &lt;stdio.h&gt;<span style="color: rgba(0, 0, 0, 1)">   
    #include </span>&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>.h&gt;<span style="color: rgba(0, 0, 0, 1)">         
    #include </span>&lt;strings.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;stdlib.h&gt;<span style="color: rgba(0, 0, 0, 1)">      
    #include </span>&lt;unistd.h&gt;<span style="color: rgba(0, 0, 0, 1)">         
    #include </span>&lt;sys/types.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;sys/socket.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;netinet/<span style="color: rgba(0, 0, 255, 1)">in</span>.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include </span>&lt;arpa/inet.h&gt;<span style="color: rgba(0, 0, 0, 1)">
    #include</span>&lt;pthread.h&gt;
    <span style="color: rgba(0, 0, 255, 1)">#define</span> PORT 1234
    <span style="color: rgba(0, 0, 255, 1)">#define</span> BACKLOG 1





<span style="color: rgba(0, 0, 255, 1)">void</span> *start_routine( <span style="color: rgba(0, 0, 255, 1)">void</span> *<span style="color: rgba(0, 0, 0, 1)">ptr)
{
    </span><span style="color: rgba(0, 0, 255, 1)">int</span> fd = *(<span style="color: rgba(0, 0, 255, 1)">int</span> *<span style="color: rgba(0, 0, 0, 1)">)ptr;
    </span><span style="color: rgba(0, 0, 255, 1)">char</span> buf[<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">];
      </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> numbytes;
    </span><span style="color: rgba(0, 0, 255, 1)">int</span> i,c=<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">this is a new thread,you got connected\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">fd=%d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,fd);


    </span><span style="color: rgba(0, 0, 255, 1)">if</span> ((numbytes=recv(fd,buf,<span style="color: rgba(128, 0, 128, 1)">100</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">){
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">recv() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> str;
    </span><span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> buffer;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将收到的字符串反转</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span>(c=<span style="color: rgba(128, 0, 128, 1)">0</span>;c&lt;(numbytes-<span style="color: rgba(128, 0, 128, 1)">1</span>);c++<span style="color: rgba(0, 0, 0, 1)">)
    {
    buffer</span>=<span style="color: rgba(0, 0, 0, 1)">buf;
    }



      printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">receive message:%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,buf);

    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">numbytes=%d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,numbytes);

    </span><span style="color: rgba(0, 0, 255, 1)">for</span>(i=<span style="color: rgba(128, 0, 128, 1)">0</span>;i&lt;numbytes;i++<span style="color: rgba(0, 0, 0, 1)">)
    {
      str</span>=buf;

    }


    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">server will send:%s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,str);
    numbytes</span>=send(fd,str,<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(str),<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
    printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">send numbytes=%d\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,numbytes);
    close(fd);
}


</span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">main()
{

    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> listenfd, connectfd;   
    </span><span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in server;
    </span><span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in client;      
    </span><span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> sin_size;
    sin_size</span>=<span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span><span style="color: rgba(0, 0, 0, 1)"> sockaddr_in);



    pthread_t thread; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义一个线程号</span>

    <span style="color: rgba(0, 0, 255, 1)">if</span> ((listenfd = socket(AF_INET, SOCK_STREAM, <span style="color: rgba(128, 0, 128, 1)">0</span>)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
    {   
      perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Creating socket failed.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }


    </span><span style="color: rgba(0, 0, 255, 1)">int</span> opt =<span style="color: rgba(0, 0, 0, 1)"> SO_REUSEADDR;
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, </span>&amp;opt, <span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(opt));

    bzero(</span>&amp;server,<span style="color: rgba(0, 0, 255, 1)">sizeof</span><span style="color: rgba(0, 0, 0, 1)">(server));

    server.sin_family</span>=<span style="color: rgba(0, 0, 0, 1)">AF_INET;
    server.sin_port</span>=<span style="color: rgba(0, 0, 0, 1)">htons(PORT);
    server.sin_addr.s_addr </span>=<span style="color: rgba(0, 0, 0, 1)"> htonl (INADDR_ANY);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 绑定</span>
    <span style="color: rgba(0, 0, 255, 1)">if</span> (bind(listenfd, (<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *)&amp;server, <span style="color: rgba(0, 0, 255, 1)">sizeof</span>(<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr)) == -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) {
    perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Bind error.</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }   

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 监听 </span>
    <span style="color: rgba(0, 0, 255, 1)">if</span>(listen(listenfd,BACKLOG) == -<span style="color: rgba(128, 0, 128, 1)">1</span>){<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> calls listen() </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
    perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">listen() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    }

    </span><span style="color: rgba(0, 0, 255, 1)">while</span>(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
    {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> accept </span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> ((connectfd = accept(listenfd,(<span style="color: rgba(0, 0, 255, 1)">struct</span> sockaddr *)&amp;client,&amp;sin_size))==-<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">) {
      perror(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">accept() error\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      exit(</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
      }



      printf(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">You got a connection from %s\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,inet_ntoa(client.sin_addr) );


      pthread_create(</span>&amp;thread,NULL,start_routine,(<span style="color: rgba(0, 0, 255, 1)">void</span> *)&amp;<span style="color: rgba(0, 0, 0, 1)">connectfd);

    }
    close(listenfd);

}</span></pre>
</div>
<p>代码从U盘复制到home后,编译执行</p>
<p>打开三个中端</p>
<p><img src="https://img2018.cnblogs.com/blog/1490994/201906/1490994-20190620103033826-1227731278.png"></p>
<p>&nbsp;</p>
<p>可以发现用户端和服务器端连接成功,即用户端发送的信息,服务器端可以接收的到。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/weixinyu98/p/11057217.html
頁: [1]
查看完整版本: Linux下实现客户端和服务器端的通信