Linux 下的TCP通信的应用 服务器+客户端

一.客户端 

所谓socket套接字 按照我的理解就算是GPS定位  主要通过(IP+端口) 来指定地点,在客户端而言,指定服务器的ip地址和端口就能指定唯一的那台服务器 

connect成功之后,就能与服务器全双工地收发信息 分别调用 read 和 write 去收发,要注意read也是阻塞性的函数

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#define serverip "192.168.157.134"
#define serverport 6677
int main(int argc,char* argv[]){
        char buff[64]="wo ai ni!";
        char * str1="Do you like C++?";
        char * str2="Why do you like C++?";
        char * str3="Me too";
        int client_sock=socket(AF_INET,SOCK_STREAM,0);
        struct sockaddr_in client_addr;
        bzero(&client_addr,sizeof(client_addr));

        client_addr.sin_family=AF_INET;
        inet_pton(AF_INET,serverip,&client_addr.sin_addr);
        client_addr.sin_port=htons(serverport);

        connect(client_sock,(struct sockaddr*) &client_addr,sizeof(client_addr));
        int len=write(client_sock,str1,strlen(str1));
        perror("write:");
        fflush(stdout);
        while(1){
        len= read(client_sock,buff,sizeof(buff)-1);
        
        if(len>0){
              buff[len]='\0';
              printf("%s\n",buff);
              fflush(stdout);
              if(strcmp(buff,"Yes.I do")==0){
                write(client_sock,str2,strlen(str2));
               }
          }else if(len==0){
            printf("disconnect\n");
            fflush(stdout);
            client_sock=socket(AF_INET,SOCK_STREAM,0);
            connect(client_sock,(struct sockaddr*) &client_addr,sizeof(client_addr));
            write(client_sock,str3,strlen(str3));
            break;
          }
        }

        close(client_sock);
        return 0;
}

二.服务器端

与客户端不同的是 ,服务器端需要一个绑定的"接口"收取来自四面八方的客户端连接请求,所以这个需要bind的socket是固定的,静止的. 通俗意义上来讲就相当于一个收件箱 你只需要负责绑定从服务器的哪个端口进,还有允许哪些ip访问就行,我这里的INADDR_ANY相当于0.0.0.0,就是任何人都能访问.然后每当有新的连接进来,分别创立一个socket与之通信就行了. 

很多人不理解socket到底是什么,其实本质意义上他是一个int类型的数,是操作系统分配给你的一个数字,相当于唯一的标识符,你只需要通过这个数字去进行网络编程,不需要你涉及具体的TCP/IP协议,操作系统内核会帮你处理这些细节,你只需要用这个数字 去进行网络编程就行了,让网络编程变得简单很多.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ctype.h>
#include <arpa/inet.h>
#define SERVER_PORT 6677
int main(int argc,char* argv[]){

    int server_sock= socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in server_addr;
    bzero(&server_addr,sizeof(server_addr));
        char content[64];
    server_addr.sin_family=AF_INET;
    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    server_addr.sin_port=htons(SERVER_PORT);

    bind(server_sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
    listen(server_sock,128);
    printf(" 正在listen\n");
    char * str1="Yes.I do";
    char * str2="Because i can use it to write programs.";
    char * str3="And you?";
    while(1){
    struct sockaddr_in client_addr;
    int client_sock;
    char buff[64];

    int client_length=sizeof(client_addr);
    printf("waiting new connect!\n");
    client_sock=accept(server_sock,(struct sockaddr*)&client_addr,&client_length);
    printf("client ip:%s\t port:%d\n ",inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,buff,sizeof(buff)),ntohs(client_addr.sin_port));

    while(1){
        int size=read(client_sock,content,sizeof(content)-1);
        content[size]='\0';
        if(!strcmp(content,"Do you like C++?")){
                content[size]='\0';
                printf("%s\n",content);
                fflush(stdout);
                write(client_sock,str1,strlen(str1));

        }else if(!strcmp(content,"Why do you like C++?")){
                content[size]='\0';
                printf("%s\n",content);
                fflush(stdout);
                write(client_sock,str2,strlen(str2));
                write(client_sock,str3,strlen(str3));
                close(client_sock);
                break;
        }else {
                content[size]='\0';
                printf("%s\n",content);
                fflush(stdout);
                break;
        }
      }
   }
   return 0;
}

三.功能

这个例子主要功能就是双方的一个相互通信的例子,在什么时候发送什么句子,并且双方都是全双工通信.

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值