linux in a simple TCP socket program (1) (containing detailed notes)

The program implements the mutual transfer between the server and client message in linux system, wherein the server and the client are modeled by a system of two terminals linux. I use linux system is CentOS 7.

The following is a server-side program:

#include <sys/types.h>
#include <sys/socket.h>                         // 包含套接字函数库
#include <stdio.h>
#include <netinet/in.h>                         // 包含AF_INET相关结构
#include <arpa/inet.h>                          // 包含AF_INET相关操作的函数
#include <unistd.h>
#define PORT 3339                              //定义端口
int main()
{
   char sendbuf[256]="OK";                     //定义要发送的消息
   char buf[256];                              //定义接收消息的区域
   int s_fd, c_fd;                             // 服务器和客户套接字标识符
   int s_len, c_len;                           // 服务器和客户端消息长度
   struct sockaddr_in s_addr;                  // 服务器IPv4套接字地址
   struct sockaddr_in c_addr;                  // 客户端IPv4套接字地址
   s_fd = socket(AF_INET, SOCK_STREAM, 0);     // 创建套接字
   s_addr.sin_family = AF_INET;                // 定义服务器套接字地址中的域
   s_addr.sin_addr.s_addr=htonl(INADDR_ANY);   // 定义套接字地址为本机IP
   s_addr.sin_port = PORT;                     // 定义服务器套接字端口
   s_len = sizeof(s_addr);                     // 获取结构体s_addr的长度
   bind(s_fd, (struct sockaddr *) &s_addr, s_len);// 綁定套接字与设置的端口号

   listen(s_fd, 10);                     // 监听状态,守候进程,最大请求数为10

   printf("请稍候,等待客户端发送数据\n");
   c_len = sizeof(c_addr);               //获取客户端结构体c_addr长度
   c_fd = accept(s_fd,(struct sockaddr *) &c_addr,(socklen_t *__restrict) &c_len);                   //接收客户端连接请求
   while (1) 
   {
        if(recv(c_fd,buf,256,0)>0)      //接收消息recv(c_fd,buf,256,0)>0
        {
                 printf("收到客户端消息:\n %s\n",buf);//输出到终端
                 send(c_fd,sendbuf,sizeof(sendbuf),0);//回复消息
        }
   }
   close(c_fd); <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">                                // 关闭连接</span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">}</span>
</pre><span style="font-size: 18px;">该下面是客户端的程序:</span><pre name="code" class="cpp">#include <sys/types.h>
#include <sys/socket.h>                         // 包含套接字函数库
#include <stdio.h>
#include <netinet/in.h>                         // 包含AF_INET相关结构
#include <arpa/inet.h>                          // 包含AF_INET相关操作的函数
#include <unistd.h>
#define PORT 3339                               //定义端口
int main() 
{
   int sockfd;                                 // 客户套接字标识符
   int len;                                    // 客户消息长度
   struct sockaddr_in addr;                    // 远端主机套接字地址
   int newsockfd;
   char buf[256]="come on!";                   // 定义要发送的消息
   int len2;
   char rebuf[256];                            // 定义接收消息的区域

   sockfd = socket(AF_INET,SOCK_STREAM, 0);    // 创建套接字

   addr.sin_family = AF_INET;                  // 远端主机地址中的域
   addr.sin_addr.s_addr=htonl(INADDR_ANY);     // 远端主机IP地址
   addr.sin_port = PORT;                       // 远端主机端口
   len = sizeof(addr);

   newsockfd = connect(sockfd, (struct sockaddr *) &addr, len);
                                               //发送连接服务器的请求
   if (newsockfd == -1) 
   {
      perror("连接失败");
      return 1;
   }
   len2=sizeof(buf);                           //获取发送数据的长度
while(1)
{
    printf("请输入要发送的数据:\n");
    scanf("%s",buf);
    send(sockfd,buf,len2,0);                   //发送消息
    if(recv(sockfd,rebuf,256,0)>0)             //接收新消息
    { 
    printf("收到服务器消息:\n %s \n",rebuf);   //输出到终端
    }
}
   close(sockfd);                              // 关闭连接
   return 0;
}


Published 48 original articles · won praise 65 · views 70000 +

Guess you like

Origin blog.csdn.net/xiaolong361/article/details/52331961