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

来源:互联网 发布:人工智能类电影 编辑:程序博客网 时间:2024/05/29 16:49
      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;}
原创粉丝点击