【linux】服务器和客户端通过套接字通信

一共三个“.c”文件

1.tcp_server.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#define PORT 8888
#define BACKLOG 2

int main(int argc, char *argv[]){
  int ss,sc;
  struct sockaddr_in server_addr;
  struct sockaddr_in client_addr;
  int err;
  pid_t pid;

  ss = socket(AF_INET, SOCK_STREAM, 0);
  printf("%d\n",ss);
  if( ss < 0 ){
    printf("socket error\n");
    return -1;
  }

  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);;
  server_addr.sin_port = htons(PORT);

  err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
  printf("%d\n",err);
  if( err < 0 ){
    printf("bind error\n");
    return -1;
  }

  err = listen(ss, BACKLOG);
  printf("%d\n",err);
  if( err < 0 ){
    printf("listen error\n");
    return -1;
  }

  while(1){
    socklen_t addrlen = sizeof(struct sockaddr);

    sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);
    printf("sc = %d\n",sc);
    printf("ss = %d\n",ss);
    if( sc < 0 ){
      continue;
    }

    pid  = fork();
    if( pid == 0 ){
      process_conn_server(sc);
      close(ss);
    }else{
      close(sc);
    }
  }
}

2.tcp_client.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#define PORT 8888
int main(int argc, char *argv[]){
  int s;
  struct sockaddr_in server_addr;

  s = socket(AF_INET, SOCK_STREAM, 0);
  printf("s = %d\n",s);
  if( s < 0 ){
    printf("socket error\n");
    return -1;
  }

  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  server_addr.sin_port = htons(PORT);

  inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
  connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
  process_conn_client(s);
  close(s);
  return 0;
}

3.tcp_process.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

void process_conn_server(int s){
  ssize_t size = 0;
  char buffer[1024];
  printf("1.OK\n");

  while(1){
    size = read(s, buffer , 1024);

    if(size == 0){
      return;
    }
    sprintf(buffer ,"%d bytes altogether\n", (int)size);
    write(s, buffer, strlen(buffer)+1);
  }
}

void process_conn_client(int s){
  ssize_t size = 0;
  char buffer[1024];
  printf("2.OK\n");

  while(1){
    size = read(0, buffer, 1024);
    if( size > 0 ){
      write(s, buffer, size);
      size = read(s, buffer, 1024);
      write(1, buffer, size);
    }
  }
}

4.makefile

all:client server

client:tcp_process.o tcp_client.o
	gcc -o client tcp_process.o tcp_client.o
server:tcp_process.o tcp_server.o
	gcc -o server tcp_process.o tcp_server.o
tcp_process.o:
	gcc -c tcp_process.c -o tcp_process.o
tcp_client.o:
	gcc -c tcp_client.c -o tcp_client.o
tcp_server.o:
	gcc -c tcp_server.c -o tcp_server.o
clean:
	rm -f client server *.o

PS:此文章仅个人学习总结之用

猜你喜欢

转载自blog.csdn.net/qq_40458825/article/details/89088427
今日推荐