linux中一个简单的TCP套接字程序(1)(内含详细注释)

该程序在linux系统中实现了服务器和客户端之间相互传送消息,其中服务器和客户端分别通过一个linux系统中的两个终端进行模拟。本人使用的linux系统为CentOS 7。

下面是服务器端的程序:

#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;
}


发布了48 篇原创文章 · 获赞 65 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/xiaolong361/article/details/52331961