LINUX下如何创建TCP客户端和服务器,实现通信

      TCP的客户端和服务器的创建

1.socket是属于LINUX下的进程间通信的一种方式BSD,(socket)套接字。
既可以实现同一台主机间的进程间通信,也可以实现不同主机间的进程间通信,
也是操作系统给应用程序提供的用于网络通信的接口。
在Linux下,由于一切皆文件,所以socket也是一种文件。可以通过文件描述符去操作。
2.IP号:主机的唯一标识。
子网掩码:用于判断数据包向外网还是向内网发送。
IP地址在使用必须转换为二进制形式(inet_addr)。
对应的端口号转换(htons);
IP区分主机,端口号区分进程。
3.客户端的创建(对应的函数)
(1)创建SOCKET套接字 (socket)
(2)绑定地址信息(bind)(这一步骤可以省略,系统会自动分配)
(3)发送连接请求(connect)
(4)收发消息(send/recv)
(5)关闭套接字 (close)
4.服务器的创建(对应的函数)
(1)创建SOCKET套接字 (socket)
(2)绑定地址信息(bind)(服务器对应的IP地址和端口号)
(3)创建一个监听队列(listen)
(4)接受连接请求 (accept)
(5)收发消息 (send/recv)
(6)关闭套接字 (close)
写的不好,希望海涵。
下面就是具体的代码客户端xldClient.c如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>


int main()
{
    //定义Internet协议结构,客户端的IP信息
     struct sockaddr_in myaddr;
     memset(&myaddr,0,sizeof(myaddr));
     myaddr.sin_family = PF_INET;
     myaddr.sin_port = htons(1314);
     myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  //1.创建套接字
   int clientId = socket(PF_INET,SOCK_STREAM,0);
   if(clientId<0)
   {
    perror("socket\n");
    return  -1;
   }
   printf("socket ok\n");
  //2发起链接请求
  int ret = connect(clientId,(struct sockaddr *)&myaddr,sizeof(myaddr));
  if(ret <0)
  {
    perror("connect\n");
    close(clientId);
    return -1;
  }
  printf("connect ok\n");
  // 3接收消息
  while(1)
  {
      char buf[1024];
      memset(buf,0,1024);
      ret = recv(clientId,buf,sizeof(buf),0);
      if(ret<0)
      {
          perror("recv\n");
          close(clientId);
          return -1;
      }
      printf("received from xldserver:%s\n",buf);
      memset(buf,0,1024);
      printf("xldclient: ");
      gets(buf);
      if(strcmp(buf,"quit")==0)
       {

          break;
       }
      ret=send(clientId,buf,sizeof(buf),0);
      if(ret<0)
      {
          perror("send\n");
          close(clientId);
          return -1;
      }
  }

  //4.关闭套接字
  close(clientId);
  return 0;
}

下面是服务器的具体代码 xldServer.c 如下

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
int main()
{
    //定义Internet协议结构,服务器的端口号和IP地址
     struct sockaddr_in myaddr;
     memset(&myaddr,0,sizeof(myaddr));
     myaddr.sin_family = PF_INET;
     myaddr.sin_port = htons(1314);
     myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

  //1.创建套接字
   int serverId = socket(PF_INET,SOCK_STREAM,0);
   if(serverId<0)
   {
    perror("serverFd\n");
    return  -1;
   }
   printf("socket ok\n");
  //2.绑定地址信息
  int ret = bind(serverId,(struct sockaddr *)&myaddr,sizeof(myaddr));
  if(ret<0)
  {
    perror("bind\n");
    close(serverId);
    return -1;
  }
   printf("bind ok\n");
  //3.创建一个监听队列
    if(listen(serverId,10)<0)
    {
      perror("listen\n");
      close(serverId);
      return -1;
    }
    printf("listening....\n");
  //4.接受链接请求
  int conId=accept(serverId,NULL,NULL);
  if(conId<0)
  {
    perror("accept\n");
    close(serverId);
    return -1;
  }
  printf("accept ok\n");
  //5.收发消息
  while(1)
  {
      char buf[1024];
      memset(buf,0,1024);
      printf("please input message (to xldclient)\n");
       gets(buf);
       if(strcmp(buf,"quit")==0)
       {
         break;
       }
      ret = send(conId,buf,sizeof(buf),0);
      if(ret <0)
      {
          perror("send\n");
          close(serverId);
          close(conId);
          return -1; 
      }
      ret = recv(conId,buf,sizeof(buf),0);
      if(ret<0)
      {
          perror("recv\n");
          close(serverId);
          close(conId);
          return -1; 
      }
      printf("from xldclient:%s\n",buf);
  }
  //6.关闭套接字
  close(serverId);
  close(conId);
  return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值